我想过滤以下命令中的行:
$ 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格式。你能帮助我在这个案例中获得良好的正则表达式吗?
答案 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