Grep выводит только одну строку в bash script

Как я могу получить результаты grep для печати в своей строке в bash script?

При использовании 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.

При использовании той же команды grep в bash она выводится на одну строку.

Вывод моего bash script:

$ 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 script:

#! /bin/bash
VAR1="$1"
IP=`net lookup $VAR1`
echo $VAR1 resolves to: $IP
RANGE=`whois $IP | grep 'OrgName\|NetRange\|inetnum\|IPv4'`
echo $RANGE

Помимо решения, может ли кто-нибудь сказать мне, почему он это делает?

Спасибо, куча!

4 ответа

Вам нужно указать переменную, чтобы сохранить формат:

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


Цитата очень важна в оболочке, вам нужно процитировать все ваши переменные, чтобы сохранить символы новой строки:

#!/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 в разделе цитирования. Кроме того, использование $() намного яснее, чем использование backticks, и позволяет вложенность.


Вам не хватает цитаты из переменной $RANGE.

Вы должны использовать:

echo "$RANGE"

Без quote строка новой строки не сохраняется.


Заменить:

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"

licensed under cc by-sa 3.0 with attribution.