原始问题和正文已编辑:我有以下输出来 grep 本例中的值“225”。该值是动态的,因此它可能会根据输入而变化”,但我想仅根据第 4 列中的匹配模式获取值为 225 的整行,而不丢失整行的内容。
Input:
10.20.223.10|2000-H1|1/1/2|DeviceX_4021|LG
10.20.223.10|2000-H1|1/1/3|Undiscoverable|Unkwn
10.20.225.10|2000-H1|1/1/5|DeviceZ_2050|LG
10.20.223.10|2000-H1|1/1/8|DeviceY_225_|Kenmore
Desired Output
10.20.223.10|2000-H1|1/1/8|DeviceY_225_|Kenmore
The following output its not desired:
10.20.225.10|2000-H1|1/1/5|DeviceZ_2050|LG
10.20.223.10|2000-H1|1/1/8|DeviceY_225_|Kenmore
我尝试了很多 awk 和 grep 但没有成功。请记住,我在第一列第 3 行的值为 225;所以我不需要那个输出。只需要第 4 列上与“225”匹配的所有内容即可。现在文件用管道分隔,没有任何空格。
答案1
使用awk
:
awk -F'|' '$4 ~ /[^0-9]225[^0-9]/' file
这225
在第四个字段中匹配并打印匹配值前面或后面没有数字(如1225
或2256
)的记录。
答案2
您的数据看起来适合 awk 格式:
$ awk '$8 == "225)"' INPUT
10.20.225.207 Device #1 1/1/23 Brand #2 (MODEL: 225) LG
10.20.209.252 Device #2 1/1/36 Brand #2 (MODEL: 225) LG
我们使用第 8 列,因为 awk 默认情况下用空格分隔列。
答案3
希望这对您有用:
grep 'MODEL: 225)' input-file
假设该值225
始终前面带有MODEL:
.
答案4
我用 perl 和 sed 找到了一个解决方案。如果我们能用 awk 来实现就好了。
解决方案 A 感谢 Dave Cross
- perl -aF'|' -ne '$F[3] =~ 225 并打印' < 输入
解决方案 B 感谢 John Bollinger
- sed -n '/^([^|]*|){3}[^|]*225/p' < 输入