input.txt
IP 10.10.10.1
IPCHK=$(cat input.txt | awk '/IP/ {print $2}')
if [[ $IPCHK =~ 10.* ]] ; then
echo " $IPCHK "
else
echo " IP Not Match "
fi
有人可以帮助将上面的shell脚本转换为awk脚本吗?
谢谢,
答案 0 :(得分:1)
这应该做:
cat input.txt
IP 10.10.10.1
awk '/IP/ {print ($2~/^10\./?$2:"IP Not Match") }' input.txt
10.10.10.1
和
cat input.txt
IP 12.10.10.1
awk '/IP/ {print ($2~/^10\./?$2:"IP Not Match") }' input.txt
IP Not Match
以下是一些例子:
cat input.txt
Data
IP 10.10.10.1
Bla
Bla
IP 12.10.20.1
More
awk '/IP/ {print $2,($2~/^10\./?"OK":"IP Not Match")" Line "NR }' input.txt
10.10.10.1 OK Line 2
12.10.20.1 IP Not Match Line 5
PS不要将cat
用于可以自行读取数据的程序。
答案 1 :(得分:1)
我觉得你好像有两个条件想要匹配,并且不知道如何与它们对比。
在我实际回答你的问题之前,我要指出正则表达式10.*
匹配“10.1.2.3”,还有“102.3.4”和“210abcde”。 .*
位表示“任意数量的任何字符”,它不像你想象的那样是通配符。如果要使用正则表达式匹配RFC1918 IP地址,则需要更具体。这应该做:
^(10\.[0-9]+|192\.168|172.(1[6-9]|2[0-9]|3[01]))\.[0-9]+\.[0-9]+$
所以...基于你的例子,只要有错误信息,看起来好像一个空的$IPCHK
变量就好了,所以这样的东西可能有效:
IPCHK="$(awk '/^IP 10\./ {print $2}' input.txt)"
if [ -n "$IPCHK" ]; then
echo " $IPCHK "
else
echo " IP Not Match "
fi
或者你可以实际和两个测试:
IPCHK="$(awk '$1=="IP" && $2~/10\./ {print $2}' input.txt)"
~~
如果你想在awk中输入错误消息,这可能对你有用:
IPCHK="$(awk '
$1=="IP" {
if($2~/^10\./) {
print $2;
} else {
print "IP NOT MATCH" > "/dev/stderr";
}
}' input.txt)"
为了便于阅读,我已将其展开,但您可以删除换行符以使其成为单行。