本記事では、linuxのcutコマンドの基本的な使い方をまとめて、応用としてワーキングディレクトリにあるディレクトリの一覧を表示する方法を紹介する。
cutコマンドとは:各行から選択した部分を表示するものです。例えば、test.txtというファイルには、次のようにコロンで区切られたデータが列挙してあるとします。
aaa:bbb:ccc ddd:eee:fff ggg:hhh:iii
2番目のデータだけを表示したいときは次のようにします。
$ cut -f2 -d":" test.txt bbb eee hhh
- dオプションで、区切り文字を指定します。
- fオプションで、データの番目を指定します。
注意事項:連続する空白文字を1つの区切り文字として扱うことができないので、注意が必要です。
例えば、
$ls -l drwxr-xr-x 2 aaa bbb 4.0K 2008-10-29 12:16 dir1 drwxr-xr-x 22 aaa bbb 4.0K 2008-11-25 02:15 dir2 -rwx------ 5 aaa bbb 4.0K 2008-12-02 15:53 file1 -rwx------ 2 aaa bbb 4.0K 2008-12-02 20:19 file2のときに、ディレクトリだけを表示させたいならば
$ls -l | grep ^d | cut -d" " -f8でうまくいきそうですが、実際は
12:16 dir2となってしまいます(ちなみに、grepの引数^dは先頭がdで始まる行だけを抜き出すことを意味しています)。
原因は、dir2以外は1番目と2番目のフィールドを区切っている空白文字が2個連続しているためです。したがって、1つ目の空白文字が区切り文字としてみなされて、連続する2つ目の空白文字は2番目のデータとみなされたわけです。
応用:連続する空白文字を1つの空白に置換して、(今いるディレクトリにある)ディレクトリだけの一覧を表示するには次のようにします。
$ ls -l | sed -e 's/\s\{1,\}/ /g' -ne '/^d/p ' | cut -d' ' -f8 | column -x
sedの使い方:sedの引数として引用符で囲まれた文字列を列挙すると、順番に評価されます。したがって、上のsedの部分のコマンドは
- 空白文字(\s)の一回以上の繰り返し(\{1,\})を1個のスペースで置換する。
- 先頭がdで始まる行だけを抜き出す
columnの使い方:テキストを表形式に整形するコマンドです。ここでは標準入力からテキストを受け取っています。xオプションで縦方向でなく横方向に列挙するように指定しています。
補足
特定の列だけ取り出すにはgawkが便利です。上の例
$ls -l drwxr-xr-x 2 aaa bbb 4.0K 2008-10-29 12:16 dir1 drwxr-xr-x 22 aaa bbb 4.0K 2008-11-25 02:15 dir2 -rwx------ 5 aaa bbb 4.0K 2008-12-02 15:53 file1 -rwx------ 2 aaa bbb 4.0K 2008-12-02 20:19 file2で、ディレクトリの名前の列を出力するには
$ ls -l | awk '/^d/ {print $8}'を実行すれば良い。これはスラッシュで囲まれた条件を満たす行に関して8列目だけを出力するコマンドである。
awkを応用したコマンドの例: ディレクトリの個数をカウントする。
$ ls -l | awk '/^d/ {print $8}'| wc -l
実行したコマンドの履歴から、使用頻度順にコマンドを表示する。
$ history | awk '{print $2}' | sort | uniq -c | sort -n
- sort:行単位でソートする。nオプションをつけると、数値としてソートする。
- uniq:重複した行を削除する。ただし、このコマンドの実行前にsortを実行しておかなければならない。cオプションをつけると、重複回数を行の先頭に付け加えて結果を出力する。
0 コメント:
コメントを投稿