如何打印目录中所有文件的特定行?

时间:2012-12-20 03:49:31

标签: linux bash shell

我遇到一个错误,说我的Makefile第235行有错误:

make[4]: Leaving directory `/opt/home/root/native-upstream/native_client/tools/SRC/glibc/wctype'
make  subdir=manual -C manual ..=../ subdir_lib
make[4]: Entering directory `/opt/home/root/native-upstream/native_client/tools/SRC/glibc/manual'
Makefile:235: *** mixed implicit and normal rules.  Stop.
make[4]: Leaving directory `/opt/home/root/native-upstream/native_client/tools/SRC/glibc/manual'
make[3]: *** [manual/subdir_lib] Error 2
make[3]: Leaving directory `/opt/home/root/native-upstream/native_client/tools/SRC/glibc'
make[2]: *** [all] Error 2
make[2]: Leaving directory `/opt/home/root/native-upstream/native_client/tools/BUILD/build-glibc32'
make[1]: *** [BUILD/stamp-glibc32] Error 2
make[1]: Leaving directory `/opt/home/root/native-upstream/native_client/tools'
make: *** [build-with-glibc] Error 2

但我不知道哪个Makefile有这个错误,我的项目中有大量的Makefile:

#  find . -name Makefile
./tools/Makefile
./tools/BUILD/.gcc-extra-build-cloog-ppl/doc/Makefile
./tools/BUILD/.gcc-extra-build-cloog-ppl/Makefile
./tools/BUILD/.gcc-extra-build-cloog-ppl/test/Makefile
./tools/BUILD/.gcc-extra-build-gmp/printf/Makefile
./tools/BUILD/.gcc-extra-build-gmp/doc/Makefile
./tools/BUILD/.gcc-extra-build-gmp/tests/Makefile
./tools/BUILD/.gcc-extra-build-gmp/tests/devel/Makefile
...

所以我想打印每个Makefile的第235行,找出谁是罪魁祸首,如:

./tools/Makefile: 235: $(objpfx)c++-types-check.out: $(check-data) scripts/check-c++-types.sh
./tools/BUILD/.gcc-extra-build-cloog-ppl/doc/Makefile: 235: ifneq (,$(check-data))
./tools/BUILD/.gcc-extra-build-cloog-ppl/Makefile: 235: $(objpfx)c++-types-check.out:
./tools/BUILD/.gcc-extra-build-cloog-ppl/test/Makefile: 235: endif
./tools/BUILD/.gcc-extra-build-gmp/printf/Makefile: 235:
./tools/BUILD/.gcc-extra-build-gmp/doc/Makefile: 235:
./tools/BUILD/.gcc-extra-build-gmp/tests/Makefile: 235: #   Master Makefile for the GNU C library
./tools/BUILD/.gcc-extra-build-gmp/tests/devel/Makefile: 235:

有没有办法做到这一点?

3 个答案:

答案 0 :(得分:3)

看起来问题出现在/opt/home/root/native-upstream/native_client/tools/SRC/glibc/manual/Makefile中,因为错误之前的行说它正在进入该目录:

make[4]: Entering directory `/opt/home/root/native-upstream/native_client/tools/SRC/glibc/manual'
Makefile:235: *** mixed implicit and normal rules.  Stop.

也就是说,有几种方法可以找到每个Makefile的第235行。人们已经指出了awk和sed解决方案。如果您还想要文件名,快速简便的解决方案是使用grep

find . -name Makefile -print0 | xargs -0 grep -nH $ | grep :235:

find命令查找名为Makefile的所有文件,将它们打印出以null分隔(如果名称中有空格的文件,则不会出现问题)。 xargs将这些文件名传递给grepgrep -nH打印每个匹配行的文件名和行号; $作为模式确保每一行匹配(它匹配每行的结尾)。然后你在那里寻找你正在寻找的行号。

它并不完美;你可能会发现其中有几行恰好包含“:235:”,但它应该可以快速一次性使用(如果你真的在乎,可以使用`grep'^ [^:] *:235: '以确保您只匹配行号。)

答案 1 :(得分:1)

我认为最直接的方式是

sed -n '235p' *

这将打印当前目录中所有文件的第235行。如果您想通过目录递归或排除某些文件,则必须使用更明确的glob或find -exec

所以最后,你可能想要的是:

find . -type f -name Makefile -print -exec sed -n '235p' {} \;

答案 2 :(得分:1)

以下是findawk

的解决方案
find -type f -name "Makefile" -exec awk 'FNR==235 {print FILENAME; print}' {} +

打印:

  • Makefile名称
  • 该Makefile的第235行

<强>解释

  • find -type f -name "Makefile" - 递归查找当前工作目录中名为Makefile的所有文件
  • -exec awk 'FNR==235 {print FILENAME; print}' {} + - 对于找到的每个此类文件,请使用awk打印其名称,然后使用第235行的内容。