awkメモ(ifとかgsubとか)

概要

  • aws s3 ls --recursiveしたテキストからawkコマンドを使ってファイル名を抜き出す
  • こんなものに需要があるわけではないと思うが、awkのコマンドメモは割と見返したりするので、自分用

詳細

aws s3 ls

aws s3 ls --recursiveをすると、以下のようなテキストが取れる

2023-04-28 15:51:30       6592 path/to/file/file1.jpg
2023-04-28 15:51:30      12042 path/to/file/file2.jpeg
2023-04-28 15:51:30      60251 path/to/file/file3.png
2023-04-28 15:51:30       7176 path/to/file/file4.jpg
2023-04-28 15:51:30       7176 path/to/file/file5.htlm
2023-04-28 15:51:30       7176 path/to/file/file6.jpg

これがファイルになっていると仮定

aws s3 ls s3://bucket-name/path/to/target/directory/ --recursive --profile my-profile > s3.txt

awkで抽出

cat s3.txt | awk '{ if (match($4, /^path\/to\/file\/.*(\.jpg|\.png)/)) { gsub(/^path\/to\/file\//, "", $4); print "./"$4 } }'
./file1.jpg
./file3.png
./file4.jpg
./file6.jpg

解説

awk '{ if (match($4, /^path\/to\/file\/.*(\.jpg|\.png)/))

これが$4つまり4つ目のカラムから抜き出して、正規表現matchで特定のパターンが存在するかどうかを判定するif文

{ gsub(/^path\/to\/file\//, "", $4);

こちらが、gsubで文字列の置換をしている部分。
先頭のpath/to/file/の部分を削除している

print "./"$4

最後に先頭に./を追記してプリントしている