bash脚本中Grep命令的问题

时间:2010-02-24 16:05:05

标签: linux bash grep

我在bash脚本中使用grep时遇到了一些相当不寻常的问题。下面是我正在使用的bash脚本代码展示行为的示例:

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文件输出任何内容,即使文件位置列表中的当前行确实存在匹配(我运行命令在终端没有问题)。

我在互联网上翻找,看看是否有其他人有类似的行为,到目前为止,我发现它与在Bash中的grep命令之前运行的其他命令的缓冲和非缓冲输出有关脚本....

然而,似乎没有人找到解决方案,所以基本上我问你们,如果你曾经遇到过这个,以及任何关于这个问题的想法/提示/解决方案......

此致

4 个答案:

答案 0 :(得分:1)

“问题”是标准的I / O库。当它写到终端时 它是无缓冲的,但如果它正在写入管道,那么它会设置缓冲。

尝试更改

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

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

答案 1 :(得分:0)

$FILE_LOCTN_LIST中是否有名称中包含空格的目录?因为如果它们是,那些空间将需要以某种方式逃脱。 findxargs的某些组合通常可以为您处理,尤其是xargs -0

答案 2 :(得分:0)

使用md5sum和sort的小型bash脚本检测当前目录中的重复文件:

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

答案 3 :(得分:0)

你标记了linux,有些我认为你有像GNU find,md5sum,uniq,sort等工具这里有一个查找重复文件的简单例子

$ 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