最近よく使ったコマンドのメモ

最近、シェルスクリプトを書くことが多くて文字列処理をたくさんしたのですが、その中でとても便利だったコマンドをメモしておこうかと。
ただ、ディストリビューションとかコマンドそのもののバージョンによって微妙に違うのでいつでもそれが使えるわけじゃないのだけど……
awksedも大活躍だったのだけど、いろいろ覚えたせいで書くのが面倒なので今回はスルーするかなー。
環境:Ubuntu 12.04 LTS 64bit

cut

$ echo -n 'aaa,bbb,ccc' | cut -d , -f 2
bbb
$ echo -n 'aaa,bbb,ccc' | cut -d , -f 2,3
bbb,ccc

簡易awk的なことができるcutコマンド。

paste

$ cat aaa
1
2
3
4
5
$ cat bbb
aaa fff
bbb ggg
ccc hhh
ddd iii
eee jjj
$ paste aaa bbb
1	aaa fff
2	bbb ggg
3	ccc hhh
4	ddd iii
5	eee jjj
$ paste -d : aaa bbb
1:aaa fff
2:bbb ggg
3:ccc hhh
4:ddd iii
5:eee jjj

ファイルの中身を行ごとに横に?連結できるpasteコマンド。
デフォルトだとタブで連結されるので、-dで連結される文字を指定できる。

tr

$ echo 'a,b,c,d,e,f,g,h,i,j,k,l,m' | tr , ' '
a b c d e f g h i j k l m
$ echo 'a,b,c,d,e,f,g,h,i,j,k,l,m' | tr , :
a:b:c:d:e:f:g:h:i:j:k:l:m
$ echo 'a1b2c3d4e5f6g7' | tr [:digit:] ' '
a b c d e f g

特定の一文字を置換するtrコマンド。
……だと思ってたらPOSIXの文字クラスが指定できるみたい。

join

$ cat aaa
1 one
2 two
3 three
4 four
5 five
$ cat bbb
1 aaa
2 bbb
3 ccc
4 ddd
5 eee
$ join aaa bbb
1 one aaa
2 two bbb
3 three ccc
4 four ddd
5 five eee

2つのファイルの共通のカラムをいい感じに混ぜてくれるjoinコマンド。

split

$ cat <<'EOB' > aaa
> aaa
> bbb
> ccc
> EOB
$ split -l 1 aaa
$ head x*
==> xaa <==
aaa

==> xab <==
bbb

==> xac <==
ccc

ファイルをバイト数や行数ごとにファイル分割してくれるsplitコマンド。
大きくなりすぎたファイルを、指定行数ごとに分割するときにとっても役に立ったり。

sort

$ cat aaa
1
6
5
4
3
9
10
14
19
$ sort aaa
1
10
14
19
3
4
5
6
9
$ sort -n aaa
1
3
4
5
6
9
10
14
19

並べ替えをするsortコマンド。
今までオプションは使ったことなかったんだけど、意図する順序でなかった場合に使うと、とってもいいかも。
-uを使うとuniq的なこともできるみたい。

uniq

$ cat aaa
1
1
1
1
3
3
3
3
2
4
5
9
8
7
$ uniq aaa
1
3
2
4
5
9
8
7
$ uniq -u aaa
2
4
5
9
8
7
$ uniq -d aaa
1
3

重複を消したりするuniqコマンド。
-uでユニークな行だけを表示したり、-dでユニークでない行だけを表示したり。
sortと一緒に使うことが多いかも。

grep

ファイルから特定の文字列を検索する際によく使うgrepコマンド。
今回新たに知ったのは-nと-Hかな。
-nで一致した行の行番号を出力する。
-Hで一致した行が存在するファイル名を出力する。
-A [数値]で一致した行の前の行を指定された数だけ出力する。
-B [数値]で一致した業の後の行を指定された数だけ出力する。
-vで一致しない行を出力する。
-Rでディレクトリ以下のファイルを再帰的にgrepする。でもこれはfindとxargs使ったほうがいいなーと思う。

pcregrep

$ cat aaa
aaa
bbb
ccc
ddd
eee
fff
$ pcregrep -M '[ce]{3}\n\w{3}' aaa
ccc
ddd
eee
fff

バックエンドにpcreを使ったgrepコマンド。
grepで-Pを指定して改行を含めた検索をしたかったのだけど、なぜか出来なかったのでこっちを使った。
-Mでマルチラインモードになる。このモードで改行を含めると、意図した検索結果になった。


とかとか。コマンドそのものを知らなかったり、知らなかったオプションがあったり、必要に迫られるといろいろ発見するもんだなあと思ったのでした。