で文字の間の文字列が含まれます。バッシュは、私はこのような行を持つことになり、ログファイルを解析しようとしているawkの印刷
一つだけの事は、私が[
と]
の間で第一、第三及び全てのデータ(文字列全体)を印刷することができますどのように、区切り文字としてのawkとスペースを使用して任意の行
に[
と]
の間でしょうか?
予想される出力:aaa ccc: DDD
で文字の間の文字列が含まれます。バッシュは、私はこのような行を持つことになり、ログファイルを解析しようとしているawkの印刷
一つだけの事は、私が[
と]
の間で第一、第三及び全てのデータ(文字列全体)を印刷することができますどのように、区切り文字としてのawkとスペースを使用して任意の行
に[
と]
の間でしょうか?
予想される出力:aaa ccc: DDD
のgawk(GNU awkの)アプローチ:
するのは、私たちに次の行を含むファイルを言ってみましょう:
aaa bbb ccc: ddd [fff] ggg hhh
コマンド:
awk '{match($0,/\[([^]]+)\]/, a); print $1,$3,a[1]}' file
出力:正規表現で一致最長の左端のストリングのため
aaa ccc: fff
一致(文字列、正規表現[配列])
検索ストリングregexpそして、その部分文字列が始まる文字位置(インデックス)を返します。 文字列)。一致が見つからない場合、
"["と "]"の間にあるデータは、4番目のものである必要はありません –
$ 1 3ドルは必須ですか? '['と ']'の間のデータが任意の位置にある場合、 'aaa bbb ccc:ddd [fff] ggg hhh [jjj]'のような複数のエントリが存在する可能性がありますか? – RomanPerekhrest
'['と ']' $と$ 3の間には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 ...
awk '$5=="[DDD]"{gsub("[\\[\\]]","");print $1,$3,$5}' file
または
awk '$5=="[DDD]"{print $1,$3, substr($5,2,3)}' file
aaa ccc: DDD
私は何が間違っているか知りたいですか? –
わかりませんが、コードのみの回答には一般的に尋ねられます。 –
を持っている場合、それはまた、あなたが試みたが、どのようにそれをやっているどのような正しいフィールド順序で印刷されます)を2回
aaa
を印刷しません。失敗します? Awkの紹介の最初のページの半分を読んでこれを解決できるはずです。 – tripleee'awk '{print $ 1、$ 3、$ 4}'ファイル ' – RomanPerekhrest
' awk' {print $ 1、$ 3、???} ''、特定の場所でデータを印刷するのですが、文字列内の任意の場所にあることができる文字。 –