grep输出在bash脚本中只打印单行

22 浏览
0 Comments

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 

除了解决方案外,有人能告诉我为什么会出现这种情况吗?

非常感谢!

0
0 Comments

在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脚本中,为了保留变量的格式,建议始终使用引号引用变量。

0
0 Comments

在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`变量中的所有行,保留了原始的换行符。

0
0 Comments

在bash脚本中,如果使用grep命令输出结果只显示一行,可能是由于以下原因导致的。

问题原因:

你忘记给$RANGE变量加上引号。

正确的使用方式是:

echo "$RANGE"

如果没有使用引号,换行符将无法保留。

解决方法:

在使用echo命令打印变量时,需要将变量用引号包裹起来,这样可以保留变量中的换行符。所以正确的解决方法是在echo语句中加上引号,如echo "$RANGE"。这样就可以正确地输出多行结果。

通过以上解决方法,你可以在bash脚本中使用grep命令输出多行结果,而不仅仅只显示一行。

0