2013-10-29 7 views
-1

我遇到了腳本的問題,我在基於Debian的分發上運行: 我想將包含「Hello World」的每個整行復制到新的文本文件中。 現在,我用這個腳本做:將定義的行復制到Linux Bash中的另一個文件

#!/bin/bash 
string1=$(grep "Hello World" log.txt) 
if [ "$string1" != "" ]; then 
    echo $string1 >> output.txt 
fi 
truncate --size 0 log.txt 

但是有一個問題: 我運行此腳本計劃每個小時。 如果在一個小時內在log.txt中寫入10個「Hello World」,我將在output.txt中的所有行中匹配「Hello World」。閱讀這個非常令人困惑。

如何將每個包含「Hello World」的整行輸出到output.txt中的分隔行中?

(帶截斷最後一行僅僅是我不明白寫的空行)

+1

聽起來像一個問題,可以通過查看'grep'的命令行選項來解決... – abiessu

+0

嗨,謝謝,但我已經讀了很多次,找不到這個設置。我知道,如果你在cli上搜索某些東西,輸出是多行的。但是,當您在腳本中使用它並將其放到一個變量中時,它是單行的。我知道變量通常是單線。但有沒有解決方案把每個匹配的數組中的一個字符串? – user2933837

回答

0

編寫的語句,如var=$(grep "pattern" file)在腳本導致變量包含一整套用空格分隔語句結果的。以生產含有一個單獨的行每個結果的文件,喜歡寫東西

var=$(grep "pattern" file) 
for v in "$var" 
do 
    echo $v >> $outfile 
done 

然而,這將有任何模式/包含空格線的問題,所以它可能是更好的做一些這樣的:

var=($(grep "pattern" file)) # creates an array 
for v in "${var[@]}" # guards against whitespace issues 
do 
    echo $v >> $outfile 
done 

如果你只需要統計,你也可以考慮使用var=$(grep -c "pattern" file)。請參閱this question

+0

謝謝,幹得好,解決了我的問題。 – user2933837

+0

出於好奇,是否有任何特定的原因,你決定循環通過腳本的結果,而不是執行像grep「模式」文件>> log.txt'? – abiessu

相關問題