UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Shell】grepした結果を加工して書き出す

久々にshellを使って文字列操作をしようとしたらわからず調査しまくったのでメモ

きっともっといい方法があるだろうけど、とりあえず調べたことが勉強になったのでよかった

やりたいこと

  1. 特定のキーワードでgrepしてファイルに書き出す
  2. 書き出したファイルの行数を取得
  3. 行数分ループ
  4. grep結果のファイルから1行ずつ取り出す
  5. 改行があるとうまく書き出せなかったので、改行を消した上で「: 」でカット
  6. 加工したものをファイルに書き出す
file1=grep_result # ファイル名の定義
grep -nr $word $dir/* > $file1 # 特定ワードをgrepしてファイルに書き出す
nmax=`wc -l $file1 | cut -f1 -d "g"` # 書き出したファイルの行数を取得
for n in `seq 1 $nmax`; do # 行数分ループ
  ll=`awk "NR==$n {print}" $file1` #grep結果のファイルから1行ずつ取り出す
  cc=`echo "$ll" | tr -d "\n" | cut -f1 -d :` #改行があるとうまく書き出せなかったので、改行を消した上で「:」でカット
  echo "$cc" >> $file2 #加工したものをファイルに書き出す
done

grep

$ grep -nr $word $dir/*
  • -nオプション:検索結果に行番号を表示する
  • -rオプション:ディレクトリ内も検索対象とする

wc

$ wc -l $file1 | cut -f1 -d "g"
17065 grep_result
  • -lオプション:行数を表示する

検索結果が行数 ファイル名で表示されるので、cutで行数だけ切り出す

  • -fオプション:切り出す位置を指定する(区切り文字はデフォルトはタブ、「-d」オプションで変更可能)
  • -dオプション:区切り文字を指定する(1文字のみ)

ファイル名がgrep_resultgから始まるのでgで区切る

seq

$ seq 1 $nmax

seq 開始の数 終了の数で開始の数から終了の数まで1ずつ増分するリストをつくる

awk

$ awk "NR==$n {print}" $file1

NR変数で、処理中の行数が取得できる

NR==$nの場合、その行を表示する

tr

$ tr -d "\n"
  • -dオプション:指定した文字があったら削除する