Text-Processing
從某個任意字元串的第一個實例到最後一個實例獲取文件的內容
如何
less
從某個任意字元串“foo”的第一個實例查看到最後一個實例?這個任意字元串將出現在日誌的幾乎每一行。我不想這樣做,
grep "foo" bar.log | less
因為它不會出現在相關的每一行上。假設文件是
1 Random junk I don't want to see 2 Care about (foo) 3 Care about (foo) 4 Care about 5 Care about (foo) 6 Other random junk I don't want to see
不幸的是,我想忽略的行沒有遵循一個很好的模式,否則我可以只使用
grep -v 'insert pattern here'
.我想知道如何以
less
某種方式獲得以下內容,2 Care about (foo) 3 Care about (foo) 4 Care about 5 Care about (foo)
grep "foo" bar.log | less
將不起作用,因為它忽略了我關心的第 4 行。
如果你有
awk
你可以這樣做:awk '/foo/{print b$0;b="";x=1;next} x{b=b$0"\n"}' bar.log | less
當 a
foo
出現時,它列印緩衝區(b
變數)和目前行,並清除緩衝區。否則,但只有在
foo
已經出現(x
變數)的情況下才會緩衝目前行。
它需要一些仔細的 shell 引用,但您可以為此使用可編寫腳本的編輯器
ed
:printf '%s\n' "/foo/ka" "??" "'a,.w "'!less' q | ed -s file
這將四個命令發送到
ed
:
/foo/ka
– 搜尋(從文件的開頭)模式 foo;在第一場比賽中,設置一個名為a
.??
– 重複搜尋,但向後搜尋,環繞文件末尾;這裡重要的副產品是它將目前行設置為那個(最後一個)匹配。'a,.w !less
– 從命名的標記a
到目前行 (.
),將這些行寫入 shell 命令 (!
)less
。q
- 退出編輯。您需要
less
優雅地退出 (q
) 才能ed
退出。此解決方案假定該模式在文件中至少存在一次,否則搜尋將失敗,並且您將在退出?
前獲得三個 ’s 。ed