3

如何从 grep 获取结果以在 bash 脚本中自己的行上打印?

在终端中使用 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 resolves to: 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 resolves to: $IP
RANGE=`whois $IP | grep 'OrgName\|NetRange\|inetnum\|IPv4'`
echo $RANGE 

除了解决方案,谁能告诉我为什么会这样?

非常感谢!

4

4 回答 4

10

您需要引用变量以保留格式:

echo "$RANGE"

代替

echo $RANGE

全部一起:

#!/bin/bash <--- be careful, you have an space after ! in your code
VAR1="$1"

IP=$(net lookup $VAR1) #<--- note I use $() rather than ``
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
于 2013-09-25T13:17:31.527 回答
2

引用在 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在引用部分阅读。也使用$()比使用反引号更清晰,它允许嵌套。

于 2013-09-25T13:17:47.127 回答
1

您缺少$RANGE变量的引号。

你应该使用:

echo "$RANGE"

如果没有quote换行符,则不会保留。

于 2013-09-25T13:18:12.597 回答
1

代替:

RANGE=`whois $IP | grep 'OrgName\|NetRange\|inetnum\|IPv4'`
echo $RANGE 

whois $IP | grep 'OrgName\|NetRange\|inetnum\|IPv4'

或者

RANGE=`whois $IP | grep 'OrgName\|NetRange\|inetnum\|IPv4'`
echo "$RANGE"
于 2013-09-25T13:18:23.717 回答