【Linux】find・xargs・grep・awk のパイプ組み合わせ備忘録|bash -c での $ エスケープも解説

いつも 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で実験しました。

もしよろしかったら、こちらの記事もどうぞ!

PAGE TOP
タイトルとURLをコピーしました