在文件夹上使用tr和grep的最佳方法是什么?

时间:2015-11-30 01:43:02

标签: grep

我正在尝试搜索文件夹中的所有文件以获取以下字符串

<cert>
</cert>

但是,我必须删除换行符。 以下代码适用于一个文件,但如何通过tr和grep管道整个文件夹? -l选项仅打印文件名而不是整个文件。

 tr -d '\n' < test | grep -l '<cert></cert>'

1 个答案:

答案 0 :(得分:1)

tr / grep方法需要grep将整个文件作为一行处理。虽然GNU grep可以处理长行,但许多其他人不能。此外,如果文件很大,可能会对内存征税。

以下内容可以避免这些问题。它会搜索当前目录中的所有文件,并在一行中报告包含<cert>的任何文件的名称,并在下一行报告</cert>的名称:

awk 'last ~ "<cert>" && $0 ~ "</cert>" {print FILENAME; nextfile} {last=$0}' *

如何运作

awk隐式循环遍历文件中的所有行。

此脚本使用一个变量last,其中包含上一行的文本。

  • last ~ "<cert>"&amp;&amp; $ 0~&#34;&#34;`

    此测试是否(a)最后一行包含字符<cert>和(b)当前行包含字符</cert>

    如果您确实想要包含<cert>而不包含其他字符的行,请将~替换为==

  • {print FILENAME; nextfile}

    如果前面的条件返回true,则打印文件的名称并从下一个文件开始。

    nextfile是awk的common extension,成为POSIX 2012.)

  • {last=$0}

    这会将变量last更新为当前行。