Text-Processing

從某個任意字元串的第一個實例到最後一個實例獲取文件的內容

  • October 29, 2019

如何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

當 afoo出現時,它列印緩衝區(b變數)和目前行,並清除緩衝區。

否則,但只有在foo已經出現(x變數)的情況下才會緩衝目前行。

它需要一些仔細的 shell 引用,但您可以為此使用可編寫腳本的編輯器ed

printf '%s\n' "/foo/ka" "??" "'a,.w "'!less' q | ed -s file

這將四個命令發送到ed

  1. /foo/ka– 搜尋(從文件的開頭)模式 foo;在第一場比賽中,設置一個名為a.
  2. ??– 重複搜尋,但向後搜尋,環繞文件末尾;這裡重要的副產品是它將目前行設置為那個(最後一個)匹配。
  3. 'a,.w !less– 從命名的標記a到目前行 ( .),將這些行寫入 shell 命令 ( !) less
  4. q- 退出編輯。

您需要less優雅地退出 ( q) 才能ed退出。此解決方案假定該模式在文件中至少存在一次,否則搜尋將失敗,並且您將在退出?前獲得三個 ’s 。ed

引用自:https://unix.stackexchange.com/questions/270465