web-dev-qa-db-ja.com

AWKマルチデリミタ

以下の行を含むファイルがあります。

/logs/tc0001/Tomcat/tomcat7.1/conf/catalina.properties:app.env.server.name = demo.example.com
/logs/tc0001/Tomcat/tomcat7.2/conf/catalina.properties:app.env.server.name = quest.example.com
/logs/tc0001/Tomcat/tomcat7.5/conf/catalina.properties:app.env.server.name = www.example.com

上記の出力では、3つのフィールド(番号2、4と最後のフィールド*.example.com)を抽出したいと思います。次のような出力が得られます。

cat file | awk -F'/' '{print $3 "\t" $5}'
tc0001   Tomcat7.1
tc0001   Tomcat7.2
tc0001   Tomcat7.5

'='の後にあるドメイン名で最後のフィールドも抽出するにはどうすればいいですか? multiple delimiterを使ってフィールドを抽出する方法

171
Satish

区切り文字は正規表現にすることができます。

awk -F'[/=]' '{print $3 "\t" $5 "\t" $8}' file

を生成します。

tc0001   Tomcat7.1    demo.example.com  
tc0001   Tomcat7.2    quest.example.com  
tc0001   Tomcat7.5    www.example.com
281
embedded.kyle

良い知らせです。 awkフィールドセパレータは正規表現にすることができます。あなただけの-F"<separator1>|<separator2>|..."を使用する必要があります。

awk -F"/|=" '{print $3, $5, $NF}' file

戻り値:

tc0001 Tomcat7.1  demo.example.com
tc0001 Tomcat7.2  quest.example.com
tc0001 Tomcat7.5  www.example.com

ここに:

  • -F="/|="は、入力フィールドの区切り文字を/または=に設定します。次に、出力フィールドの区切り文字をタブに設定します。

  • {print $3, $5, $NF}は、入力フィールドの区切り文字に基づいて3番目、5番目、および最後のフィールドを出力します。


別の例を見てください。

$ cat file
hello#how_are_you
i#am_very#well_thank#you

このファイルには#_の2つのフィールド区切り文字があります。セパレータがどちらであっても2番目のフィールドを印刷したい場合は、両方をセパレータにしましょう。

$ awk -F"#|_" '{print $2}' file
how
am

ファイルの番号は次のとおりです。

hello#how_are_you           i#am_very#well_thank#you
^^^^^ ^^^ ^^^ ^^^           ^ ^^ ^^^^ ^^^^ ^^^^^ ^^^
  1    2   3   4            1  2   3    4    5    6
30
fedorqui

空白が一致している場合は、\tを直接挿入する代わりにこれを区切り文字として使用できます。出力区切り文字を設定すると、自動的に含まれるようになります。

< file awk -v OFS='\t' -v FS='[/ ]' '{print $3, $5, $NF}'
5
Thor

2から5までの任意の数のフィールド区切り文字、または文字a#、または区切り文字を2回以上6回以下の範囲で繰り返す必要がある場合

awk -F'[2-5a# ]{2,6}' ...

私は()とパラメータを使ってこれの変形が存在すると確信しています

3
genome

Perlのワンライナー:

Perl -F'/[\/=]/' -lane 'print "$F[2]\t$F[4]\t$F[7]"' file

これらのコマンドラインオプションが使用されます。

  • -nは入力ファイルのすべての行をループし、その行を$_変数に入れます。すべての行を自動的には表示しません。

  • -lは処理前に改行を削除し、その後それらを追加し直します

  • -a自動分割モード - Perlは自動的に入力行を@F配列に分割します。空白で分割するデフォルト

  • -F autosplit修飾子、この例では/または=のどちらかに分割されます

  • -eはPerlコードを実行します

Perlはawkと密接に関係していますが、@F autosplit配列はインデックス$F[0]で始まり、awkフィールドは$ 1で始まります。

2
Chris Koknat

私は多くの完璧な答えが出ているのを見ていますが、それでも私のコードをアップロードしたいと思います、

awk -F"/" '{print $3 " " $5 " " $7}' sam | sed 's/ cat.* =//g'

0
Sadhun