grep输出在bash脚本中只打印单行
grep输出在bash脚本中只打印单行
在bash脚本中,如何使grep的结果单独打印在一行上?
当在终端中使用grep时,输出的格式是我所期望的。
例如:
$ whois x.x.85.72 | grep 'OrgName\|NetRange\|inetnum\|IPv4' NetRange: x.x.85.64 - x.x.85.95 NetRange: x.x.0.0 - x.x.255.255 OrgName: xxxxx Technologies Inc.
但在bash脚本中使用相同的grep命令时,输出会打印在一行上。
我的bash脚本输出:
$ lookup xx.com xx.com解析为:x.x.85.72 NetRange: x.x.85.64 - x.x.85.95 NetRange: x.x.0.0 - x.x.255.255 OrgName:xxxxx Technologies Inc.
我的bash脚本:
#! /bin/bash VAR1="$1" IP=`net lookup $VAR1` echo $VAR1解析为:$IP RANGE=`whois $IP | grep 'OrgName\|NetRange\|inetnum\|IPv4'` echo $RANGE
除了解决方案外,有人能告诉我为什么会出现这种情况吗?
非常感谢!
在bash脚本中,grep命令的输出只打印一行的问题出现的原因是没有对变量进行引用。正确的做法是使用引号将变量引起来,以保留其格式。下面是解决该问题的方法:
首先,需要将代码中的echo $RANGE改为echo "$RANGE",以保留变量的格式。
其次,需要注意脚本中的#!/bin/bash一行后面有一个空格,需要将其删除。
最后,使用$()语法替代``语法,将代码中的IP=$(net lookup $VAR1)改为IP=$(net lookup $VAR1)。
下面是完整的脚本代码:
#!/bin/bash VAR1="$1" IP=$(net lookup $VAR1) echo $VAR1 resolves to: $IP RANGE=$(whois $IP | grep 'OrgName\|NetRange\|inetnum\|IPv4') echo "$RANGE"
举个例子来说明,给定以下内容:
$ date; date Wed Sep 25 15:18:39 CEST 2013 Wed Sep 25 15:18:39 CEST 2013
让我们分别使用带引号和不带引号的方式打印结果:
$ myvar=$(date; date) $ echo $myvar Wed Sep 25 15:18:45 CEST 2013 Wed Sep 25 15:18:45 CEST 2013 $ echo "$myvar" Wed Sep 25 15:18:45 CEST 2013 Wed Sep 25 15:18:45 CEST 2013
从上面的例子可以看出,使用引号的方式可以保留变量的格式,而不使用引号会将多行结果合并成一行输出。因此,在bash脚本中,为了保留变量的格式,建议始终使用引号引用变量。
在Shell脚本中,引用非常重要,需要引用所有变量以保留换行符:
#!/bin/bash VAR1="$1" IP=$(net lookup "$VAR1") echo "$VAR1 resolves to: $IP" RANGE=$(whois "$IP" | egrep 'OrgName|NetRange|inetnum|IPv4') echo "$RANGE"
在引用部分阅读`man bash`。此外,使用`$()`比使用反引号更清晰,并且允许嵌套使用。
问题解释:
在上述脚本中,`RANGE=$(whois "$IP" | egrep 'OrgName|NetRange|inetnum|IPv4')`语句的作用是通过`whois`命令查询给定IP的相关信息,并使用`egrep`过滤出其中包含的"OrgName"、"NetRange"、"inetnum"和"IPv4"关键词的行。然后将过滤结果赋值给变量`RANGE`。然而,当查询结果中有多行匹配时,这个语句只会打印出其中的一行。
出现原因:
这个问题的出现是因为在使用`echo "$RANGE"`打印`RANGE`变量时,只会打印出其中的一行。这是因为`echo`命令会自动去除换行符,并将其替换为空格。
解决方法:
要解决这个问题,可以使用`printf`命令代替`echo`命令来打印`RANGE`变量。`printf`命令不会自动去除换行符,可以保留原始的输出格式。
以下是修改后的脚本:
#!/bin/bash VAR1="$1" IP=$(net lookup "$VAR1") echo "$VAR1 resolves to: $IP" RANGE=$(whois "$IP" | egrep 'OrgName|NetRange|inetnum|IPv4') printf "%s\n" "$RANGE"
这样修改后,`printf "%s\n" "$RANGE"`将会打印出`RANGE`变量中的所有行,保留了原始的换行符。