243

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

/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フィールドを抽出するにはどうすればよいですか?

4

8 に答える 8

399

デリミタには正規表現を使用できます。

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
于 2012-08-30T19:47:35.440 に答える
6

空白が一貫している場合は、それを区切り記号として使用できます。また、直接挿入する代わりに\t、出力区切り記号を設定すると、自動的に含まれます。

< file awk -v OFS='\t' -v FS='[/ ]' '{print $3, $5, $NF}'
于 2012-08-30T19:51:09.520 に答える
5

任意の数字2から5文字aまたは#スペースまでのフィールド区切り文字の場合、区切り文字を 2 回以上 6 回まで繰り返す必要があります。次に例を示します。

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

( ) とパラメーターを使用して、これのバリエーションが存在すると確信しています

于 2015-03-22T13:50:26.627 に答える
3

Perl ワンライナー:

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

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

  • -n入力ファイルのすべての行をループし、その行を$_変数に入れ、すべての行を自動的に出力しない

  • -l処理前に改行を削除し、後で追加し直します

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

  • -Fautosplit 修飾子。この例では、/または=

  • -eperl コードを実行する

Perl は awk と密接に関連していますが、@Fautosplit 配列は index で始まり、$F[0]awk フィールドは $1 で始まります。

于 2015-09-09T16:58:19.507 に答える
0

多くの完璧な回答がボード上にあるのを見ていますが、それでも私のコードもアップロードしたいと思います。

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

于 2015-02-25T14:38:57.163 に答える