【问题标题】:Problems with Grep Command in bash scriptbash 脚本中的 Grep 命令问题
【发布时间】:2010-02-24 16:05:05
【问题描述】:

我在 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

在许多情况下,当 grep 查找文件位置列表中的当前行时,即使文件位置列表中的当前行肯定有匹配项,它也没有输出到当前的 dupechk 文件(我运行了命令在终端没有问题)。

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

但是似乎没有人找到解决方案,所以基本上我是在问你们是否遇到过这个问题,以及这个问题的任何想法/提示/解决方案......

问候

保罗

【问题讨论】:

  • 你到底想做什么?我们或许可以提出更好的解决方法。
  • 我有一个很长的 bash 脚本,用于执行在给定目录中定位重复文件的操作。脚本的这一部分是查找重复项并将其打印到文件中。值得注意的是,我这样做是为了完成一项大学课程,并且不允许使用 awk 命令。
  • awk 命令是不允许的,但 sed/grep 是?大声笑
  • cat 已经用了 3 次了,这三个都不需要。
  • 意识到最后一天,我把它归结为使用 linux 命令的经验不足!

标签: linux bash grep


【解决方案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`

【讨论】:

  • 救命稻草。我现在明白你已经解释过了,但如果不是这样,我永远不会想到这一点,谢谢!
【解决方案2】:

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

【讨论】:

  • 我目前正在使用这个命令来编译 $FILE_LOCTN_LIST: echo $SCAN_DIRNAME | xargs -I {/} find {/} -type f > $FILE_LOCTN_LIST 我认为 xargs -I 的表现类似于 xargs -0 ?
  • 好的,如果是单个文件名就不会转义了。
【解决方案3】:

一个使用 md5sum 和排序的小型 bash 脚本,用于检测当前目录中的重复文件:

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

【讨论】:

    【解决方案4】:

    你标记了 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-05
      • 2020-03-21
      • 1970-01-01
      • 2019-12-25
      • 1970-01-01
      相关资源
      最近更新 更多