Text-Processing

awk 匹配參數上方的所有行

  • January 21, 2020

我有一個名為 test.out 的文件,其中包含以下幾行:

-rw-rw----    1 informix informix    9117025 Jan 21 05:22 shop4_0_Log0000331875.Z
-rw-rw----    1 informix informix    8897981 Jan 21 05:24 shop4_0_Log0000331876.Z
-rw-rw----    1 informix informix    9325351 Jan 21 05:31 shop4_0_Log0000331877.Z
-rw-rw----    1 informix informix    9645109 Jan 21 05:34 shop4_0_Log0000331878.Z
-rw-rw----    1 informix informix    9950581 Jan 21 05:40 shop4_0_Log0000331879.Z
-rw-rw----    1 informix informix   10655940 Jan 21 05:59 shop4_0_Log0000331880.Z
-rw-rw----    1 informix informix   10832325 Jan 21 06:39 shop4_0_Log0000331881.Z
-rw-rw----    1 informix informix    8521443 Jan 21 07:42 shop4_0_Log0000331882.Z
-rw-rw----    1 informix informix   10283566 Jan 21 08:02 shop4_0_Log0000331883.Z
-rw-rw----    1 informix informix   10633957 Jan 21 08:51 shop4_0_Log0000331884.Z

我想列印 grep 值 331881 參數以上的所有行:

我想要的結果必須如下所示:

-rw-rw----    1 informix informix    9117025 Jan 21 05:22 shop4_0_Log0000331875.Z
-rw-rw----    1 informix informix    8897981 Jan 21 05:24 shop4_0_Log0000331876.Z
-rw-rw----    1 informix informix    9325351 Jan 21 05:31 shop4_0_Log0000331877.Z
-rw-rw----    1 informix informix    9645109 Jan 21 05:34 shop4_0_Log0000331878.Z
-rw-rw----    1 informix informix    9950581 Jan 21 05:40 shop4_0_Log0000331879.Z
-rw-rw----    1 informix informix   10655940 Jan 21 05:59 shop4_0_Log0000331880.Z

使用下面的命令,我可以指定上面要列印的行數:

grep -n 331881 test.out | cut -d':' -f1 |  xargs  -n1 -I % awk "NR<=%+0 && NR>=%-1" test.out | sed '$d'

在這種情況下,上面的命令將只列印指定數量的行 1 行,但我想將上面的內容更改為列印 grepped 行以上的所有內容。我正在努力尋找解決問題的方法或更簡單的方法。

我認為您可以直接使用 awk :

awk '/331881/ { exit } 1' test.out

這將列印所有行,但對於匹配的行331881,退出。

假設您位於包含列出的文件的目錄中,請使用zsh

ls -ld shop4_0_Log<331882->.Z

<331882->是一個特定的zshglob,它匹配 331882 或更大的整數。

使用其他外殼:

for name in shop4_0_Log*.Z; do
   number=${name#shop4_0_Log}
   number=${number%.Z}

   if [ "$number" -ge 331882 ]; then
       ls -ld "$name"
   fi
done

在這裡,我們遍歷以 開頭shop4_0_Log和結尾的名稱.Z。對於每個這樣的名稱,我們選擇文件名的整數部分,如果它是 331882 或更多,我們呼叫ls -ld該名稱。

如果前導零導致 shell 將某些數字解釋為八進制(在我的測試中沒有),則10#$number在測試中使用強制將數字解釋為十進制整數(這由kshandbash和一些支持其他貝殼)。

這兩種變體都不依賴於包含某些ls輸出的文本文件的存在。

有關的:

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