2012/03/16

BASHが好きになる! 13の便利なコマンド

普段使いできる、便利なLinuxコマンドを集めてみました。コマンドってたくさんあるし、オプションの付け方で今まで知らなかった便利な使い方ができるんですよね。




ls -1
パーミッション情報やオーナー情報を除いた、純粋なファイル名だけを出力する。 以下の2つは同じ。
for FN in `ls -1`; do
  wc -l ${FN}
done
ls -1 | while read FN; do
  wc -l ${FN}
done
wc -l
wc -l は、渡されたファイル名の行数を出力するコマンドだけど、オプションで渡す場合とパイプして渡す場合とで出力内容が違う。 パイプ渡しする方は数字だけの出力なので、sedやcutで加工する手間が省ける。こちらの方がよく使う。
wc -l a.txt
9 a.txt

cat a.txt | wc -l
9
cat [ファイル名] | head -n [行数] | tail -n [行数]
超基本のコマンドをパイプしただけのコマンドだけど、表示したい行の範囲が分かっている時(膨大な量のログファイルの一部分など)は有効。わざわざファイルをcatしたのは、さんざん加工した後のデータにも使える事を強調するため。 先のwc -lと絡めて動的に行数を指定する事も可能。
cat /var/log/httpd/access_log | head -n 100 | tail -n 20
# 先頭から100行の最後20行を表示する → 81行目から100行目

cat /var/log/httpd/access_log | wc -l  # 仮に5000とする
cat /var/log/httpd/access_log | tail -n 100 | head -n 20
# 末尾から100行の先頭20行を表示する → 4901行目から4920行目
tee [ファイル名]
このコマンドはシェルに書くのではなくて、出来上がったシェルにパイプして、標準出力を標準出力しつつファイルに保存する。リダイレクトしてしまうと保存はできるけど標準出力されないので、パッと処理だけを書きたい時は便利。
sh test.sh | tee test.log
seq [開始番号] [終了番号]
seqは連番を発行するコマンド。ループで連番を使いたい時に便利。
for I in `seq 1 10`; do
  echo ${I}
done

#出力結果
1
2
3
4
5
6
7
8
9
10
for I in `seq 10 15`; do
  echo ${I}
done

#出力結果
10
11
12
13
14
15
sed -e 's/[文字]//'
sedは文字列の置換を行うコマンド。例は指定した文字列(正規表現も可能)を「""」に置換する(要は消す)。
echo "this is a pencil." | sed -e 's/cil//'

#出力結果
this is a pen.
cut -d" " -f1
cutは文字列を-dオプションで指定した文字で区切る。-fは出力するフィールドのことで、区切り文字で区切られた文字列の塊を1フィールドと数えて指定する。
echo "this is a pencil." | cut -d " " -f2

#出力結果
is

echo "this is a pencil." | cut -d " " -f2,3

#出力結果
is a
{ }
はぁ?って感じですが・・・。ループ処理の中でファイル出力する内容が多い場合、そのファイル出力がネックになってシェル自体の実行速度が落ちることがある。そういう場合はループ処理全体を「{}」で囲んで、リダイレクトすると、ループが終わってから出力を書き込むようになる(I/Oが発生するのが1回だけになる)。
{
ls -1 | while read FN; do
  wc -l ${FN}
done
} > a.txt 
bash -x(sh -x)
シェルの中で使うんじゃなくて、実行する時に使う。-xはデバッグ用にif文の分岐など細かい処理の内容まで出力してくれるのでエラーが発生した時に使う。変数を展開してくれるので便利。
cat test.sh    # テスト用のシェルスクリプト
#! /bin/bash

if [ "$1" = "test" ]; then
  echo "\$1 is test"
else
  echo "\$1 is not test"
fi

bash -x test.sh test    # 引数を付けて実行
+ '[' test = test ']'
+ echo '$1 is test'
$1 is test

sh -x test.sh    # 引数なしで実行
+ '[' '' = test ']'
+ echo '$1 is not test'
$1 is not test
du -h --max-depth=1
今いるディレクトリ配下にあるディレクトリの容量を調べる。--max-depth=1を付けないで実行すると、ファイル数が多いとどえらい量の出力がコンソールを流れていく。--max-depth=1を付けることで検査対象を直接の子ディレクトリに限定してディレクトリ全体の容量を得ることができる。lsでは分からない情報なので結構使う。
du  -h --max-dept=1 /var/log
31M     ./httpd
8.0K    ./ppp
16K     ./mail
384K    ./samba
8.0K    ./setroubleshoot
3.5M    ./cups
8.0K    ./conman
28K     ./gdm
36K     ./prelink
12K     ./pm
8.0K    ./conman.old
8.0K    ./squid
19M     ./audit
65M     .
netstat -np
-nオプションはIPアドレスで表示するオプションで、-pオプションはポートを利用しているプロセス名とプロセスIDを表示する。プロセスIDは特に便利。-nを使うのは名前解決をしない方が早い(ような気がする)から。付けない方がホスト名が出るのでわかりやすい。ちなみに-pオプションの実行はルート権限が必要。
netstat -np
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 192.168.1.1:22            192.168.1.2:61081        ESTABLISHED 31924/sshd: hogehoge
tcp        0      0 192.168.1.1:445           192.168.1.3:1520          ESTABLISHED 31147/smbd
tcp        0      0 192.168.1.1:445           192.168.1.4:51309        ESTABLISHED 9973/smbd
less
lessはmoreと同じような高機能なファイル閲覧コマンドだけど、lessが優っている点としてはzip圧縮されたファイルもいちいち展開せずに読める点がある。gzip -dするのが面倒な時(ちゃんと固めてくれてるログファイルとかね!)はlessで読むといい。
less hogehoge.gz
zgrep
zip絡みで便利なコマンドといえば、zipファイル用のgrep、zgrepでしょう。使い方はgrepと変わらずなので分かりやすい。普通のテキストファイルをzgrepにかけてもgrepと同じ振る舞いをしてくれるので何も考えずにxargsで流し込んでもおk。
zgrep "hogehoge" fugafuga.gz

便利なコマンドはこんなもんじゃないと思いますが、ふと思いついたものを並べてみました。基本的なコマンドでもmanを眺めてみると以外なオプションがあったりするんですよね。

またネタが貯まったら放出したいと思います。


0 件のコメント:

コメントを投稿