Select files from sub-directories and print a certain line from each file
我有一个有几个子目录的目录,这些子目录有许多文件,我对*.txt文件感兴趣。我想转到每个子目录,读取*.txt文件并打印与"pattern匹配的行。我想把它当作一条班轮。
这是我试过的命令。
1
| for i in $(ls -d *_fastqc); do cd $i; awk '/FAIL/ {print $0}' ls -l su*.txt; done |
我得到一个错误命令,如下所示:
awk: cmd. line:1: fatal: cannot open file `-rw-rw-r--' for reading (No such file or directory)
这里可能出什么事了?
- 错误来自于您的ls -l,它显示了作为awk输入的长格式。尝试ls -1,但是前面评论中的链接是正确的方式,而不是循环。
Awk不是用于此目的的正确工具,请看为什么不应该分析ls ouput,
相反,使用GNU find列出符合您与xargs标准的文件,用于取消限制从find和grep返回的用于模式匹配的输出。
1
| find . -type f -name"*.txt" -print0 | xargs -0 grep"FAIL" |
-print0 (a GNU find specific option)在每个文件/目录的末尾附加一个NULL字符,用于处理带有空格/特殊字符的文件,xargs -0将stdin的输入拆分为\0作为去限制器。在返回的文件上使用grep返回文件中的行(如果匹配)。
- xargs是不必要的……find -type f -name '*.txt' -exec grep -F 'FAIL' {} +
- 也可以使用,而不需要GNU grep查找……grep --include='*.txt' -rF 'FAIL'
- "你们真该在GNU grep选项给螺纹上被发现的文件。有好的工具,以perfectly perfectly明显的名称。下一步是将他们给grep选项来排序或选择它的输出数据到文件?该工具发现的文件是《find只是使用它。
- "不同意edmorton find find、grep是元文件,发现文件或流(中文本)。在这个案例的时候,你可以使用到分叉的第一。这将取决于操作系统的标准定义了一个没到最佳的方式(性能,内存,代码阅读,相容性,…)
- "我明白了neronlevelu可能影响性能的发现(在第一,但sundeeps评论)将被调用grep文件在多个团队,不只是1,使任何潜在的性能优势:grep grep的R - R的,事实上是不做什么"的原则,已经violates UNIX每个工具做一件事阱和使精氨酸nightmarish电位表。通过给grep参数文件不一致,他们发现成功与每个其他工具,例如sed,awk读取文件,CAT,排序法,头,尾,等等。你可以认为所有这些性能的改善也
- 你也可以认为这是可能的改进的性能,如果它是sortgrep的输出到字符或字符或其他translate paste线从不同的文件或任何其他的任何工具已经不多。如果它吗?当然,这不是因为violates Unix构建解决方案的原理:利用多个紧密衔接,loosely耦合工具。它是不同的,如果有需要,但这是不是这样的。