2016-04-25 7 views
0

特定の文字を含む行をegrepしようとしています。私は、単一のegrepを実行すると は、それがegrep(動的出力あり)

egrep -w -h -R 'name' /path/file1.txt > /path/file2.txt 

を正常に動作します。しかし、私はforループを使用して複数のegrepを実行すると、出力はすべて空でした。

for i in {Adam Bob Chuck Dan Eli Frank}; do egrep -w -h -R 'i' /path/file1.txt > /path/name"$i".txt; done 

出力ファイルを単一のegrepでダブルチェックした場合、出力ファイルごとにいくつかの情報があるはずです。私はここで何か間違っているが、それは何かを理解できなかった。

助けてくれてありがとう!

+0

あなたはどのシェルを使用していますか? Bashはリストの中に中括弧を必要としないはずです。あなたは '' i ''の代わりに '' $ i "'を使う必要があります。 – jkiiski

+0

私はBashを使用しています。私は「i」を「$ i」に置き換えてあなたの提案を試みました。ありがとうございました!!! –

答えて

2

grepを呼び出して名前ごとに入力ファイル全体を解析すると、これは非常に非効率です(https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice参照)。

一度だけ入力ファイルを読み込む:$0 ~ ("(^|[^[:alnum:]_])" list[i] "([^[:alnum:]_]|$)")

awk -v names='Adam Bob Chuck Dan Eli Frank' ' 
    BEGIN { split(names,list) } 
    { 
     for (i in list) { 
      if ($0 ~ ("\\<" list[i] "\\>")) { 
       print > ("/path/name" i ".txt") 
      } 
     } 
    } 
' /path/file1.txt 

上記のはあなただけへの正規表現の比較を変更する必要があると思い、他のawksで、ワード境界(\<\>)のためにGNU AWKを使用しています。

関連する問題