过滤命令输出时出现正则表达式错误

标签 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 

我只想提取包含 Destination 01020300 和 Mask 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"

我是正则表达式格式的新手。你能帮我为这个案例提供一个好的正则表达式吗?

最佳答案

也许为此使用 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

关于过滤命令输出时出现正则表达式错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23370085/

相关文章:

linux - 如何在shell脚本中创建套接字(域套接字)?

linux - 如何在 shell 脚本中获取 ec2-describe-instances 的标签

linux - 通过 bash 中的日期范围更改周数

python - 如何在python中超时功能,超时不到一秒

c++ - 正则表达式匹配需要永远

regex - 如何使用 sed 或 awk 基于模式匹配创建多个文件

linux - Bash `wait` 命令,等待超过 1 个 PID 完成执行

linux - google-earth-stable-7.1.2.2041-0.x86_64 与包 filesystem-3.2-13.fc19.x86_64 中的文件冲突

linux - 比较两个文件并将不匹配的数字写入新文件

javascript - 在 JS 的字符串中按字符类反转字符串