过滤命令输出时的regexp错误

时间:2014-04-29 16:20:25

标签: regex linux shell awk ash

我想过滤以下命令中的行:

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

我想只提取包含目标01020300和面具FFFFFF00

的行

我尝试使用以下正则表达式,但它不起作用

cat /proc/net/route | grep "[^ \t\v]\+[ \t\v]\+$dest[ \t\v]\+[^ \t\v]\+[ \t\v]\+[^ \t\v]\+[ \t\v]\+[^ \t\v]\+[ \t\v]\+[^ \t\v]\+[ \t\v]\+[^ \t\v]\+[ \t\v]\+$mask"

我是新手wuth regexp格式。你能帮助我在这个案例中获得良好的正则表达式吗?

1 个答案:

答案 0 :(得分:5)

为此可能更容易使用awk

$ awk '$2=="01020300" && $8=="FFFFFF00"' file
br-lan  01020300        C0A80101        0003    0       0       3       FFFFFF00        0       0       0     

这样您可以参考第2列和第8列并检查其值,而不必担心格式。

如果您的文件使用制表符而不是空格分隔fiels,请使用:

awk -F"\t" '$2=="01020300" && $8=="FFFFFF00"' file

如果你想从bash变量给出这个值,你可以这样做(参见评论,正如Glenn Jackman,Etan Reisner和Ed Morton给出了很好的解释):

awk -v d="$dest" -v m="$mask" '$2==d && $8==m' file