在awk中select行和元素

我了解到,在awk中,$ 2是第二列。 如何在第i行和第j列指定第i行和元素?

要打印第二行:

awk 'FNR == 2 {print}' 

打印第二个字段:

 awk '{print $2}' 

要打印第五行的第三个字段:

 awk 'FNR == 5 {print $3}' 

编辑 :这是一个标题行和(冗余)字段说明的例子:

 awk 'BEGIN {print "Name\t\tAge"} FNR == 5 {print "Name: "$3"\tAge: "$2}' 

顺便提一下,有比“\ t \ t”排列更好的方法。

要打印具有特定string的列,可以使用search模式。 例如,如果您正在查找包含abc的第二列:

 awk '$2 ~ /abc/' 

…如果你只想打印一个特定的列:

 awk '$2 ~ /abc/ { print $3 }' 

…和特定的行号码:

 awk '$2 ~ /abc/ && FNR == 5 { print $3 }' 

要扩展Dennis的答案,请使用awk-v选项来传递ij值:

 # print the j'th field of the i'th line awk -vi=5 -vj=3 'FNR == i {print $j}' 

由于awk和perl密切相关


@ Dennis awk解决scheme的Perl等价物:

要打印第二行:
perl -ne 'print if $. == 2' file

打印第二个字段:
perl -lane 'print $F[1]' file

要打印第五行的第三个字段:
perl -lane 'print $F[2] if $. == 5' file


@ Glenn解决scheme的Perl相当于:

打印第i行的第j个字段

perl -lanse 'print $F[$j-1] if $. == $i' -- -i=5 -j=3 file


@ Hai解决scheme的Perl等价物:

如果您正在查找包含abc的第二列:

perl -lane 'print if $F[1] =~ /abc/' foo

…如果你只想打印一个特定的列:

perl -lane 'print $F[2] if $F[1] =~ /abc/' foo

…和特定的行号码:

perl -lane 'print $F[2] if $F[1] =~ /abc/ && $. == 5' foo


-l删除换行符,并在打印时将其添加回来
-a将input行自动插入数组@F ,使用空格作为分隔符
-n循环input文件的每一行
-e在引号内执行代码
$F[1]是数组的第二个元素,因为Perl从0开始
$. 是行号

我发现这个工作命令

root @ gateway:/ home / sshuser#aws ec2 describe-instances –instance-ids i-2db0459d | grep'STATE \ | TAG'| awk'FNR == 1 {print $ 1}'