據我所知,有沒有辦法在grep
做到這一點。實際上,大多數Unix工具都是固定的基於行的。例如,我認爲在sed
中沒有辦法只打印出一部分內容。即使在awk
,也可能有一種方法來拼湊一些東西在一起,但我的猜測是,它會令人不滿意。
如果您的系統上有GNU awk的,不過,試試這個:
gawk 'BEGIN {RS="pattern"} {print RT, FILENAME; exit}' filename
RS
設置記錄分隔符(通常是新行)是模式。 RT
是由RS
匹配的文本。 FILENAME
是不言自明的。 exit
停止執行。所以,在第一條記錄之後,awk
將打印模式文本和文件名,並退出。這不適用於多個文件,因爲這裏的退出是無條件的。
如果您需要在目錄結構中的所有文件運行它,使用find
和xargs
,也不要退出,除非你找到的東西:
find . -type f -print0 | xargs -0 gawk 'BEGIN {RS="pattern"} {print RT, FILENAME; if (RT != "") exit}'
這打印出的文件名(前由一個空格)沒有模式的所有東西,但打印出模式和文件名,當它遇到第一個模式,然後停止。
當然,您需要小心一點,因爲記錄分隔符可能根本就不存在,因此gawk
可能會將文件的全部內容淹沒到其緩衝區中,並且可能會導致內存不足。 (當我在我的系統上測試時,我在490 MB時失敗了。)
來源
2011-08-25 09:18:20
JXG
我不認爲這比問題中的建議更好。 'find | cat'組合符合grep的功能。 – JXG 2011-08-25 08:41:36
@JXG:但至少它在第一場比賽後關閉了管道。因此,根據計劃的不同,可能不會打開所有文件,並且該命令會比原始提案更早退出。 – 2012-03-14 22:21:24