我试图找到以某个名称开头的所有文件,然后遍历每个文件以查找包含字符串的行,然后仅打印出包含该字符串的每个文件的最后一行。一步一步,我首先找到我的目录中以“A123”开头的所有文件
find . -name 'A123*'
Run Code Online (Sandbox Code Playgroud)
然后获取文件中包含“Trial”的每一行
find . -name 'A123*' -exec grep 'Trial' {} \;
Run Code Online (Sandbox Code Playgroud)
然后从这里我只想打印最后一行,
find . -name 'A123*' -exec grep 'Trial' {} | tail -1 \;
Run Code Online (Sandbox Code Playgroud)
但是,最后一个命令不起作用。我该如何解决这个问题才能得到我想要得到的东西?
|是一个 shell 运算符,因此 的整个输出find将传递给tail. 您只需在 exec 中运行单个命令,方法是将所有要运行的命令分组并传递给shor bash(或您喜欢的任何 shell)
find . -name 'A123*' -exec bash -c 'grep Trial "$1" | tail -1' grep {} \;
Run Code Online (Sandbox Code Playgroud)
或者您可以使用其他一些单个命令来获取如何 grep 最后一次出现的线条模式中的最后一个匹配项
如果您可以确保文件不包含特殊字符(如#$/\`&*~-...名称中的特殊字符),则可以使用此
find . -name 'A123*' -exec bash -c "grep 'Trial' {} | tail -1" \;
Run Code Online (Sandbox Code Playgroud)
但请注意,当出现您不知道的意想不到的名字时,可能会发生奇怪的事情。欲了解更多信息,请阅读是否可以find -exec sh -c安全使用?
| 归档时间: |
|
| 查看次数: |
22669 次 |
| 最近记录: |