【初心者】linuxコマンド備忘録 find + xargs + grep + awk
いつも bash -c で awk を使うと $ のエスケープを忘れちゃうので備忘録
あるディレクトリ配下にある、タブ区切りのテキストファイル(tsv)から、キーワードで抜き出した行に対して、タブで区切った最後の要素一つを抜き出したい場合。そんなケースはほぼないだろうけど、いつも bash -c で awk を使うと $ のエスケープを忘れちゃうので、備忘録。
※ 当ブログ(日々是事始め(コレコト))は、プロモーションが含まれています。
$ find . -type f -name "*.tsv" | sort | xargs -I{} bash -c "echo {}; echo \" \"; cat {} | grep 'target' | awk -F'\t' '{print \$NF}'; echo \" \";"
※例1)タブ区切りと同じもの
適当なファイルでの例
こんな感じのファイルがあるディレクトリで、以下の例を実行してみると、、、
例1)タブ区切り
このファイルが対象となって、
$ find . -type f -name "*.tsv" | sort | xargs -I{} bash -c "echo {}; echo \" \"; cat {} | grep 'target' | awk -F'\t' '{print \$NF}'; echo \" \";"
結果は以下になる
例2)カンマ区切り(csv)
このファイルが対象となって、
find . -type f -name "*.csv" | sort | xargs -I{} bash -c "echo {}; echo \" \"; cat {} | grep 'target' | awk -F',' '{print \$NF}'; echo \" \";"
結果は以下になる
例3)スペース区切り(awkの区切り文字デフォルトはスペース)
このファイルが対象になって、
find . -type f -name "*.txt" | sort | xargs -I{} bash -c "echo {}; echo \" \"; cat {} | grep 'target' | awk '{print \$NF}'; echo \" \";"
結果は以下になる
PR
bash -c の中で awk するときは、$ はエスケープする。ちなみに、以下のようにただgrepしただけと同じになっちゃいます。
誤り例)bash -c の中の awk で $ をエスケープしなかった場合
find . -type f -name "*.txt" | sort | xargs -I{} bash -c "echo {}; echo \" \"; cat {} | grep 'target' | awk '{print $NF}'; echo \" \";"
WSL2 + Docker + Ubuntuで実験しました。
もしよろしかったら、こちらの記事もどうぞ!