【问题标题】:grep output prints only single line in bash script [duplicate]grep 输出仅在 bash 脚本中打印单行 [重复]
【发布时间】:2013-10-01 02:32:07
【问题描述】:

如何从 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 

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

非常感谢!

【问题讨论】:

    标签: linux bash shell grep


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      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
      

      【讨论】:

        【解决方案3】:

        替换:

        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"
        

        【讨论】:

          【解决方案4】:

          您缺少 $RANGE 变量的引号。

          你应该使用:

          echo "$RANGE"
          

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-01-11
            • 1970-01-01
            • 2016-08-30
            • 1970-01-01
            • 1970-01-01
            • 2017-01-18
            • 2021-01-08
            相关资源
            最近更新 更多