我要从以下命令筛选行:

$ 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的行
我试过使用下面的regexp,但它不起作用
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"

我使用regexp格式。你能帮我为这个案子准备一个好的regexp吗?

最佳答案

也许使用awk更容易:

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

这样,您就可以引用第2列和第8列并检查其值,而不必担心格式问题。
如果文件用制表符而不是空格分隔字段,请使用:
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

07-24 17:08
查看更多