Linuxユーザの立場から、役立つ情報や困ったときの解決方法を分かりやすく、かつ簡潔に記事にまとめています。主に、Ubuntu 8.04(→9.04)やCentOS 5.2(→5.3)で確認したことですが、他のディストリビューションでも応用できると思います。内容は(1)設定ファイルの書き方(2)役立つソフトウェア紹介やインストール方法(3)便利なコマンドの使い方や活用例(4)困ったときの解決方法です。このページの末尾にキーワード別で記事を分類してあります。また、真上の「ブログ検索」フォームからブログ内の記事を検索できます。

2008年12月2日火曜日

cutコマンドの基本的な使い方とその応用 このエントリーを含むはてなブックマーク

本記事では、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の部分のコマンドは

  1. 空白文字(\s)の一回以上の繰り返し(\{1,\})を1個のスペースで置換する。
  2. 先頭がdで始まる行だけを抜き出す
となります。2つ目の引用符で囲まれた文字列の前でnオプションを付けていますが、これは必要です。このオプションを付けなかったら、先頭が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 コメント:

キーワード

キーワード別に記事を分類してあります。クリックすると各キーワードに該当する記事たちが表示されます。

筆者について

自分の写真
趣味はコンピュータ、音楽、写真などです。