Bash 如何使用awk进行grep IP块?
我有这样一个文本文件:Bash 如何使用awk进行grep IP块?,bash,awk,Bash,Awk,我有这样一个文本文件: 1|2|3|4|5|6|7|8|9|192.168.1.1 1|2|3|4|5|6|7|8|9|192.168.2.1 1|2|3|4|5|6|7|8|9|192.168.22.1 1|2|3|4|5|6|7|8|9|192.168.222.1 1|2|3|4|5|6|7|8|9|192.168.2.1 1|2|3|4|5|6|7|8|9|192.168.2.1 如果$10以“192.168.2”开头,我需要打印,如下所示: 1|2|3|4|5|6|7|8|9|19
1|2|3|4|5|6|7|8|9|192.168.1.1
1|2|3|4|5|6|7|8|9|192.168.2.1
1|2|3|4|5|6|7|8|9|192.168.22.1
1|2|3|4|5|6|7|8|9|192.168.222.1
1|2|3|4|5|6|7|8|9|192.168.2.1
1|2|3|4|5|6|7|8|9|192.168.2.1
如果$10以“192.168.2”开头,我需要打印,如下所示:
1|2|3|4|5|6|7|8|9|192.168.1.1
1|2|3|4|5|6|7|8|9|192.168.2.1
1|2|3|4|5|6|7|8|9|192.168.22.1
1|2|3|4|5|6|7|8|9|192.168.222.1
1|2|3|4|5|6|7|8|9|192.168.2.1
1|2|3|4|5|6|7|8|9|192.168.2.1
我试着这样做(我使用var,因为我从其他文件获得这个ip块,这只是示例):
输出:
1|2|3|4|5|6|7|8|9|192.168.2.1
1|2|3|4|5|6|7|8|9|192.168.22.1
1|2|3|4|5|6|7|8|9|192.168.222.1
我怎样才能解决这个问题?为什么在var中最后一个
不起作用?字符是通配符。您应该用\.
替换匹配字符串中的实例,并用/
包围正则表达式。如果您想参数化IP地址,这样做可能会更整洁
var="192\.168\.2\."
awk -F'|' '{if ($10 ~ /^'${var}'/) print $0;}'
您可能还希望使用Awk的模式规则语义:
awk -F'|' '$10 ~ /^'${var}'/ {print $0}'
有点整洁
您可以这样转义您的IP地址:
var=$(echo ${var} | sed 's/\./\\./g')
字符是通配符。您应该用\.
替换匹配字符串中的实例,并用/
包围正则表达式。如果您想参数化IP地址,这样做可能会更整洁
var="192\.168\.2\."
awk -F'|' '{if ($10 ~ /^'${var}'/) print $0;}'
您可能还希望使用Awk的模式规则语义:
awk -F'|' '$10 ~ /^'${var}'/ {print $0}'
有点整洁
您可以这样转义您的IP地址:
var=$(echo ${var} | sed 's/\./\\./g')
使用此
awk
:
awk -v var="192[.]168[.]2[.]" -F'|' '$10 ~ var{print}' file
如果无法更改输入IP
格式,请尝试以下操作
awk -v var="192.168.2." -F'|' 'BEGIN{gsub("[.]", "\\.", var)} $10 ~ var{print}'
输出:
使用此
awk
:
awk -v var="192[.]168[.]2[.]" -F'|' '$10 ~ var{print}' file
如果无法更改输入IP
格式,请尝试以下操作
awk -v var="192.168.2." -F'|' 'BEGIN{gsub("[.]", "\\.", var)} $10 ~ var{print}'
输出:
我得到以下输出:
1|2|3|4|5|6|7|8|9|192.168.2.1
1|2|3|4|5|6|7|8|9|192.168.22.1
1|2|3|4|5|6|7|8|9|192.168.222.1
我想这是最简单的方法
我得到以下输出:
1|2|3|4|5|6|7|8|9|192.168.2.1
1|2|3|4|5|6|7|8|9|192.168.22.1
1|2|3|4|5|6|7|8|9|192.168.222.1
我想这是实现这一点最简单的方法。试着在if块中打印$10。如果你对字段进行regex,你也可以使用
grep
,例如IP=“192.168.2”。&&IP=$(sed's/\./\./\./g'试着在if块中打印$10。如果你对字段进行regex,你也可以使用grep
,例如IP=“192.168.2”。&&IP=$(sed's/\./\\./g'OP说IP可能会动态变化。OP说IP可能会动态变化。抱歉,正则表达式应该包含在/
中,而不是“
我想说的是\。
没有给出预期的输出。因为,awk
被视为普通的
。我提供的第二个表单很有效…不知道如何让它与f
版本一起工作…很抱歉,正则表达式应该包含在
中,而不是“
我想说的是\。
没有给出预期的输出。因为,awk
被视为普通的
。我提供的第二个表单很有效…不确定如何让它与f
版本一起工作…对,但你不需要{print}
因为当前面的条件为真时,这是默认行为。您只需要awk…'$10~var'文件
。除非IP地址不总是以3位数字开头,然后您需要awk…'$10~“^”var'文件
来锚定它。对,但您不需要{print}
因为当上述条件为真时,这是默认行为。您只需要awk…“$10~var”文件
。除非IP地址不总是以3位数字开头,然后您需要awk…“$10~”^“var”文件
来锚定它。