久々にshellを使って文字列操作をしようとしたらわからず調査しまくったのでメモ
きっともっといい方法があるだろうけど、とりあえず調べたことが勉強になったのでよかった
やりたいこと
- 特定のキーワードでgrepしてファイルに書き出す
- 書き出したファイルの行数を取得
- 行数分ループ
- grep結果のファイルから1行ずつ取り出す
- 改行があるとうまく書き出せなかったので、改行を消した上で「: 」でカット
- 加工したものをファイルに書き出す
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_result
でg
から始まるのでg
で区切る
seq
$ seq 1 $nmax
seq 開始の数 終了の数
で開始の数から終了の数まで1ずつ増分するリストをつくる
awk
$ awk "NR==$n {print}" $file1
NR変数で、処理中の行数が取得できる
NR==$n
の場合、その行を表示する
tr
$ tr -d "\n"
- -dオプション:指定した文字があったら削除する