linux将dwdiff结果的最后一行重定向到一个文件

时间:2015-05-25 19:52:04

标签: linux shell

我正在尝试创建一个生成报告的sh,该报告将显示来自两个文件夹/ java项目的文件的差异。我正在使用dwdiff,我只需要每次比较的最后一行(我不关心差异,百分比是我需要的)。我创建了以下脚本:

DEST_FOLDER='./target/'
CLASSES_P1='classesP1.txt'
CLASSES_P2='classesP2.txt'
DEST_FILE='report.txt'

rm -r "$DEST_FOLDER"
mkdir -p "$DEST_FOLDER"

rm -f "$DEST_FOLDER/$CLASSES_P1"
rm -f "$DEST_FOLDER/$CLASSES_P2"
rm -f "$DEST_FOLDER/$DEST_FILE"

find ./p1 -name "*.java" >> "$DEST_FOLDER/$CLASSES_P1"
find ./p2 -name "*.java" >> "$DEST_FOLDER/$CLASSES_P2"

while read p; do
        while read t; do
                dwdiff -s $p $t | tail --lines=0 >> "$DEST_FOLDER/$DEST_FILE"
        done < $DEST_FOLDER/$CLASSES_P2

done < $DEST_FOLDER/$CLASSES_P1

它工作正常,但结果不会重定向到给定文件。该文件已创建,但为空,并且每个dwdiff结果的最后一行显示在控制台中。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

正在进行一些事情

  • 您想要的输出是stderr,而不是stdout。您可以在2>&1命令
  • 上将它们与dwdiff合并
  • 您想要的输出实际上似乎首先由dwdiff打印,但由于两个不同的输出,您会看到不同的顺序。所以你想要head而不是tail
  • 你想要1行,而不是0

请尝试dwdiff -s ... 2>&1 | head --lines=1

 $ dwdiff -s /etc/motd /etc/issue 2>&1 | head --lines=1
old: 67 words  3 4% common  2 2% deleted  62 92% changed

或者,如果您想要new行而不是旧行,并且为了简化排序,请尝试丢弃diff输出:

 $ dwdiff -s /etc/motd /etc/issue 2>&1 1>/dev/null | tail --lines=1
new: 5 words  3 60% common  0 0% inserted  2 40% changed

请注意,重定向的顺序非常重要:首先将stdout克隆到stderr,然后将stdout重定向到/dev/null