2010-02-24 154 views
0

我在bash腳本中使用grep時遇到了一些相當不尋常的問題。下面是我使用的是bash腳本代碼的例子表現該行爲:在bash腳本中grep命令的問題

UNIQ_SCAN_INIT_POINT=1 
cat "$FILE_BASENAME_LIST" | uniq -d >> $UNIQ_LIST 
sed '/^$/d' $UNIQ_LIST >> $UNIQ_LIST_FINAL 
UNIQ_LINE_COUNT=`wc -l $UNIQ_LIST_FINAL | cut -d \ -f 1` 
while [ -n "`cat $UNIQ_LIST_FINAL | sed "$UNIQ_SCAN_INIT_POINT"'q;d'`" ]; do 
    CURRENT_LINE=`cat $UNIQ_LIST_FINAL | sed "$UNIQ_SCAN_INIT_POINT"'q;d'` 
    CURRENT_DUPECHK_FILE=$FILE_DUPEMATCH-$CURRENT_LINE 
    grep $CURRENT_LINE $FILE_LOCTN_LIST >> $CURRENT_DUPECHK_FILE 
    MATCH=`grep -c $CURRENT_LINE $FILE_BASENAME_LIST` 
    CMD_ECHO="$CURRENT_LINE matched $MATCH times," cmd_line_echo 
    echo "$CURRENT_DUPECHK_FILE" >> $FILE_DUPEMATCH_FILELIST 
    let UNIQ_SCAN_INIT_POINT=UNIQ_SCAN_INIT_POINT+1 
done 

在許多場合,grepping在文件位置列表當前行的時候,就已經把沒有輸出到當前dupechk文件,即使在文件位置列表中當前行肯定存在匹配(我在終端中運行命令時沒有問題)。

我在互聯網上搜索,看看是否有其他人有類似的行爲,到目前爲止我發現的是,它是與其他命令的緩衝和無緩衝輸出有關,其他命令在grep命令之前運行Bash腳本....

然而,沒有人似乎已經找到了解決方案,所以基本上我問你們,如果你曾經遇到過這個問題,以及任何想法/提示/解決方案,這個問題...

問候

保羅

+0

你究竟在做什麼?我們可能會提出一個更好的方法來解決這個問題。 – 2010-02-24 16:15:38

+0

我有一個非常長的bash腳本,用於執行在給定目錄中查找重複文件的操作。腳本的這部分是找到重複項並將其打印到文件中。值得注意的是,爲了完成一項大學課程,並且awk命令是不允許的。 – paultop6 2010-02-24 16:19:55

+0

awk命令不允許,但sed/grep是?大聲笑 – ghostdog74 2010-02-24 16:38:29

回答

1

「問題」是標準I/O庫。當它寫入終端 時,它是無緩衝的,但是如果它正在寫入管道,那麼它會設置緩衝。

嘗試改變

CURRENT_LINE=`cat $UNIQ_LIST_FINAL | sed "$UNIQ_SCAN_INIT_POINT"'q;d'` 

使用的md5sum和分類檢測在當前目錄中的重複文件

CURRENT LINE=`sed "$UNIQ_SCAN_INIT_POINT"'q;d' $UNIQ_LIST_FINAL` 
+0

救生員。我現在明白你已經解釋過了,但永遠不會想到這件事,謝謝! – paultop6 2010-02-24 16:32:57

0

$FILE_LOCTN_LIST的名稱中是否有空格的目錄?因爲如果他們是這樣,那些空間將需要以某種方式逃脫。 findxargs的某些組合通常可以爲您處理,尤其是xargs -0

+0

我目前使用這個命令來編譯$ FILE_LOCTN_LIST: echo $ SCAN_DIRNAME | xargs -I {/} find {/} -type f> $ FILE_LOCTN_LIST 我認爲xargs -I的表現與xargs -0相似? – paultop6 2010-02-24 16:17:31

+0

好吧,如果它是單個文件的名稱,它不會被轉義。 – 2010-02-24 16:43:58

0

一個小bash腳本:

CURRENT="" md5sum * | 
    sort | 
    while read md5sum filename; 
    do 
    [[ $CURRENT == $md5sum ]] && echo $filename is duplicate; 
    CURRENT=$md5sum; 
    done 
0

您標記的Linux,一些我假設你有像GNU find,md5sum,uniq,排序等工具。這裏有一個簡單的例子來找到重複的f iles

$ echo "hello world">file 
$ md5sum file 
6f5902ac237024bdd0c176cb93063dc4 file 
$ cp file file1 
$ md5sum file1 
6f5902ac237024bdd0c176cb93063dc4 file1 
$ echo "blah" > file2 
$ md5sum file2 
0d599f0ec05c3bda8c3b8a68c32a1b47 file2 
$ find . -type f -exec md5sum "{}" \; |sort -n | uniq -w32 -D 
6f5902ac237024bdd0c176cb93063dc4 ./file 
6f5902ac237024bdd0c176cb93063dc4 ./file1