2017-04-25 6 views
2

で文字の間の文字列が含まれます。バッシュは、私はこのような行を持つことになり、ログファイルを解析しようとしているawkの印刷

一つだけの事は、私が[]の間で第一、第三及び全てのデータ(文字列全体)を印刷することができますどのように、区切り文字としてのawkとスペースを使用して任意の行

[]の間でしょうか?

予想される出力:aaa ccc: DDD

+2

を持っている場合、それはまた、あなたが試みたが、どのようにそれをやっているどのような正しいフィールド順序で印刷されます)を2回aaaを印刷しません。失敗します? Awkの紹介の最初のページの半分を読んでこれを解決できるはずです。 – tripleee

+0

'awk '{print $ 1、$ 3、$ 4}'ファイル ' – RomanPerekhrest

+0

' awk' {print $ 1、$ 3、???} ''、特定の場所でデータを印刷するのですが、文字列内の任意の場所にあることができる文字。 –

答えて

3

のgawk(GNU awkの)アプローチ:

するのは、私たちに次の行を含むファイルを言ってみましょう:

aaa bbb ccc: ddd [fff] ggg hhh 

コマンド:

awk '{match($0,/\[([^]]+)\]/, a); print $1,$3,a[1]}' file 

出力:正規表現で一致最長の左端のストリングのため

aaa ccc: fff 

一致(文字列、正規表現[配列])
検索ストリングregexpそして、その部分文字列が始まる文字位置(インデックス)を返します。 文字列)。一致が見つからない場合、

+0

"["と "]"の間にあるデータは、4番目のものである必要はありません –

+1

$ 1 3ドルは必須ですか? '['と ']'の間のデータが任意の位置にある場合、 'aaa bbb ccc:ddd [fff] ggg hhh [jjj]'のような複数のエントリが存在する可能性がありますか? – RomanPerekhrest

+0

'['と ']' $と$ 3の間には1つのエントリしかありません –

1

...ゼロを返す考える:

$ cat file 
aaa bbb ccc: [DDD] efg oi  
aaa bbb [ccc:] lll DDD efg oo  
aaa [bbb] ccc: DDD 

(注 - OPの例から変更)

POSIX awkで:

awk 'BEGIN{fields[1]; fields[3]} 
           {s="" 
           for (i=1;i<=NF;i++) 
             if ($i~/^\[/ || i in fields) 
              s=i>1 ? s OFS $i : $i 
           gsub(/\[|\]/,"",s) 
           print s 
           }' file 

印刷物:

aaa ccc: DDD 
aaa ccc: 
aaa bbb ccc: 

フィールドが両方とも[]と選択されたfieldsの配列で囲まれている場合、フィールドを2回印刷しません。 (すなわち、、[aaa] bbb ccc:はあなたがaaa [bbb] ccc ...

-1
awk '$5=="[DDD]"{gsub("[\\[\\]]","");print $1,$3,$5}' file 

または

awk '$5=="[DDD]"{print $1,$3, substr($5,2,3)}' file 

aaa ccc: DDD 
+0

私は何が間違っているか知りたいですか? –

+0

わかりませんが、コードのみの回答には一般的に尋ねられます。 –

関連する問題