2011-03-22 114 views
13

我想grep的結果分配給進一步使用一個變量:如何用換行保留grep結果?

lines=`cat abc.txt | grep "hello"` 

,但我發現了什麼是$行不包含換行符了。所以當我做

echo $lines 

只有一行被打印。我如何保留換行符,所以當我回顯$行時,它與cat abc.txt |相同grep「你好」。

+5

貓濫用:'線= $(grep的招呼的abc.txt)' 。 – 2011-03-22 04:18:31

+0

另請參閱http://stackoverflow.com/questions/613572/capturing-multiple-line-output-to-a-bash-variable/ – 2011-03-22 04:22:08

回答

32

你想說的

echo "$lines" 

代替

echo $lines 

要闡述:

echo $lines指「與變量的命名lines內容替換$lines形成一個新的命令,將其分割爲空格以形成零個或多個新的參數給echo命令。 PLE:

lines='1 2 3' 
echo $lines # equivalent to "echo 1 2 3" 
lines='1 2 3' 
echo $lines # also equivalent to "echo 1 2 3" 
lines="1 
2 
3" 
echo $lines # also equivalent to "echo 1 2 3" 

所有這些例子是等價的,這是因爲殼忽略特定種類存儲在變量lines的各個單詞之間的空格。實際上,更確切地說,shell將特殊IFS(內部字段分隔符)變量的字符上的變量內容(默認值(至少在我的bash版本上))分割爲三個字符空格,製表符和換行符。

echo "$lines"另一方面,意味着從變量lines的確切值形成單個新參數。

有關更多詳細信息,請參閱bash手冊頁的「擴展」和「分詞」部分。

+1

謝謝,它的工作原理。你能解釋一下這個區別嗎? – Dagang 2011-03-22 03:52:25

+3

+1非常有幫助的闡述。 – harpo 2011-03-22 04:07:53

0

使用Windows端口的grep(不是原來的問題,我kow和不適用於* nix)。我發現-U很好地解決了這個問題。

--help

-U,--binary不會在EOL剝離CR字符(MSDOS)

+0

它的工作原理。謝謝@Haggisbreath。使用-U日誌打印新行。 grep命令是... electron app.js | grep --line-buffered -i -e「錯誤」-U | tee logs.txt – Gaurav 2017-08-10 12:44:52