如何在1个命令中收集2个awk命令

时间:2014-04-30 08:48:04

标签: linux bash shell awk

我有以下输出

$ cat /proc/net/route
Iface   Destination     Gateway         Flags   RefCnt  Use     Metric  Mask            MTU     Window  IRTT                               
br-lan  03043836        C0A80101        0007    0       0       5       FFFFFFFF        0       0       0                                  
br-lan  C0A80100        00000000        0001    0       0       0       FFFFFF00        0       0       0  

我使用awk提取包含目的地03043836和面具FFFFFFFF的行,然后我再次使用awk显示提取行中的第一个元素:

$ dest=03043836; mask=FFFFFFFF; va=1;
$ cat /proc/net/route | awk '$2=="'"$dest"'" && $8=="'"$mask"'"' | awk '{print $'"$va"'}'
br-lan

现在我想只在一个awk命令中收集两个awk命令。怎么做?

3 个答案:

答案 0 :(得分:4)

dest=03043836; mask=FFFFFFFF; va=1;
awk -v dest="$dest" -v mask="$mask" -v va="$va" '$2==dest && $8==mask {print $va}' /proc/net/route

-v用于为变量赋值。

答案 1 :(得分:2)

您可以将所有这三个结合起来(包括此处的cat which is needless):

  

DEST = 03043836;掩模= FFFFFFFF; VA = 1;

     

awk -v dest =“$ {dest}” - v mask =“$ {mask}” - v va =“$ {va}”{print $ va}'   的/ proc /净/路由

答案 2 :(得分:1)

这不是一个答案,只是一些小例子,展示了为什么你应该使用Ashkan的答案:

---------
$ x="hello world"

$ awk -v y="$x" 'BEGIN{print y}'
hello world

$ awk 'BEGIN{print "'"$x"'"}'
hello world

---------
$ x="hello
world"

$ awk -v y="$x" 'BEGIN{print y}'
hello
world

$ awk 'BEGIN{print "'"$x"'"}'
awk: cmd. line:1: BEGIN{print "hello
awk: cmd. line:1:             ^ unterminated string
awk: cmd. line:1: BEGIN{print "hello
awk: cmd. line:1:             ^ syntax error

---------
$ x="hello world\\"

$ awk -v y="$x" 'BEGIN{print y}'
hello world\

$ awk 'BEGIN{print "'"$x"'"}'
awk: cmd. line:1: BEGIN{print "hello world\"}
awk: cmd. line:1:             ^ unterminated string
awk: cmd. line:1: BEGIN{print "hello world\"}
awk: cmd. line:1:             ^ syntax error

在后两种情况下,您希望脚本如何表现?