【发布时间】: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 命令的经验不足!