【初心者】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で実験しました。

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)