シェルスクリプトでデータを絞り込む方法いろいろ(grep、sed、awk)

2021-07-04Bash

はじめに

シェルスクリプトやコンソールでデータを絞り込むための方法をいくつか紹介します。
基本どれか一つを使えればいいと思いますが、例えば特定の今度がない!( grep コマンドを消してしまった! )なんてときに使えるかもしれません。(そんなケースあるのか?)

検証環境

$ uname -moi
x86_64 MacBookPro11,4 Darwin

$ bash -version
GNU bash, バージョン 5.0.2(1)-release (x86_64-apple-darwin18.2.0)

準備

検証用のデータ(csv)を作成。

$ cat <<'EOF' >> personal_infomation.csv
連番,氏名,氏名(カタカナ),性別,電話番号,生年月日
1,浜崎陽治,ハマザキヨウジ,男,0238930217,1974/11/03
2,奥山隆雄,オクヤマタカオ,男,0888070241,1997/08/04
3,船越瑠奈,フナコシルナ,女,0986044637,1966/04/16
4,玉置忠治,タマキタダハル,男,0779869154,1995/07/19
5,出口美香,デクチミカ,女,0289679894,1991/10/18
6,西本良之,ニシモトヨシユキ,男,0855699116,1988/03/29
7,湯川麗奈,ユカワレナ,女,0997770517,1996/03/05
8,荻野莉沙,オギノリサ,女,073800935,1987/06/20
9,海野博明,ウミノヒロアキ,男,0888070499,1998/05/23
10,高崎淳一,タカサキジュンイチ,男,0559462109,1982/05/10
EOF

grep を使った絞り込み

最もよく使われる方法。
この方法を知っていたら十分ではある。

絞り込み結果を必要に応じてバイプで次のコマンドに渡してやれば、更に可能できる。

$ grep 女 personal_infomation.csv
3,船越瑠奈,フナコシルナ,女,0986044637,1966/04/16
5,出口美香,デクチミカ,女,0289679894,1991/10/18
7,湯川麗奈,ユカワレナ,女,0997770517,1996/03/05
8,荻野莉沙,オギノリサ,女,073800935,1987/06/20

sed を使った絞り込み

sed でも絞り込みができる。
sedgrep も、後述する awk もいずれも ed という過去にあったライン志向のエディタから派生している。
grep は基本動作としてフィルタ結果を 出力しない が、 sed は基本動作としてフィルタ結果を 常に出力する

-n というオプションを指定し、基本動作を grep のように 出力しない ように設定した上で、条件に合致したもののみを sedp コマンドで出力させれば良い。
p コマンドは該当行を出力させるためのsed 組み込みコマンド。 )

$ sed -n '/女/p' personal_infomation.csv
3,船越瑠奈,フナコシルナ,女,0986044637,1966/04/16
5,出口美香,デクチミカ,女,0289679894,1991/10/18
7,湯川麗奈,ユカワレナ,女,0997770517,1996/03/05
8,荻野莉沙,オギノリサ,女,073800935,1987/06/20

awk を使った絞り込み

先述したとおり、 grepsedawk は兄弟なので、 awk でも絞り込みが可能。
sedawk は似ていて、/.../ のように "/"で囲んだ部分が絞り込み条件となる

$ awk '/女/ { print $0 }' personal_infomation.csv
3,船越瑠奈,フナコシルナ,女,0986044637,1966/04/16
5,出口美香,デクチミカ,女,0289679894,1991/10/18
7,湯川麗奈,ユカワレナ,女,0997770517,1996/03/05
8,荻野莉沙,オギノリサ,女,073800935,1987/06/20

参考

sedawk の絞り込みは単体で使うことはあまりないかもしれませんが、絞り込んで置換するようなときに便利。

2021-07-04Bash