如何使用awk使用if语句

时间:2015-01-01 17:40:00

标签: awk

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脚本吗?

谢谢,

2 个答案:

答案 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)"

为了便于阅读,我已将其展开,但您可以删除换行符以使其成为单行。