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”文件
来锚定它。