簡體   English   中英

合並grep和ls -lrt輸出的Linux命令

[英]Linux command to merge grep and ls -lrt output

我在文件夾和子文件夾中有一組日志文件。 我想顯示特定日志的出現次數以及文件時間戳記。 我在這里簡化命令以僅在一個文件夾下搜索以解決問題。

grep命令可以給我出現的次數或文件名,但不能提供時間戳。 如果我使用ls命令傳送它,那么我會減少出現的次數。 如果我將ls輸出通過管道傳輸到grep,則會松開時間戳。

以下是示例命令。 我需要第二個命令文件名之后第一個命令出現的次數。

----/logs/server> grep -c 'sample search text' *  | grep -v :0
i0_server2_wls.log:980
i0_server2_wls.log00005:20
i0_server1_wls.log:4
i0_server1_wls.log00023:186
i0_server1_wls.log00024:767
i0_server1_wls.log00027:49
i0_server1_wls.log00028:401
i0_server1_wls.log00029:199
i0_server1_wls.log00031:8122
i0_server1_wls.log00033:7744
i0_server1_wls.log00034:18476


----/logs/server> grep -l 'sample search text' * | xargs ls -lrt
-rw-r--r-- 1 mygroup myuser  41824670 Jul  8 20:42 i0_server1_wls.log00023
-rw-r--r-- 1 mygroup myuser  71726325 Jul 19 20:45 i0_server1_wls.log00024
-rw-r--r-- 1 mygroup myuser  91704808 Aug 22 17:47 i0_server1_wls.log00027
-rw-r--r-- 1 mygroup myuser  56183363 Aug 29 18:33 i0_server1_wls.log00028
-rw-r--r-- 1 mygroup myuser 162665267 Sep  6 20:14 i0_server1_wls.log00029
-rw-r--r-- 1 mygroup myuser  80384219 Sep 28 22:03 i0_server2_wls.log00005
-rw-r--r-- 1 mygroup myuser 170614866 Nov 19 22:35 i0_server1_wls.log00031
-rw-r--r-- 1 mygroup myuser 142315429 Dec  8 20:48 i0_server1_wls.log00033
-rw-r--r-- 1 mygroup myuser 335498557 Dec 12 22:38 i0_server1_wls.log00034
-rw-r--r-- 1 mygroup myuser  62375653 Dec 13 19:23 i0_server2_wls.log
-rw-r--r-- 1 mygroup myuser  38069112 Dec 13 19:23 i0_server1_wls.log

使用粘貼命令,您可以像下面這樣逐行組合輸出:

grep -c 'sample search text' * | grep -v :0 > file1.txt
grep -l 'sample search text' * | xargs ls -lrt > file2.txt
paste -d" " file1.txt file2.txt

症結在於ls -lrt可以對文件重新排序,因此簡單地按grep返回的順序paste計數可以產生混淆。 此外,最好只運行一次grep gawk可以方便地獲得所需的結果。

grep -c 'sample search text' * | gawk -F: '
    { if ($2) count[$1] = $2 }  # collect all names with non-zero counts
END { command = "xargs ls -lrt" # process to pass the file names through
      for (name in count) print name |& command
      close(command, "to")      # we are done writing "to" the coprocess
      FS=" "; while (command |& getline) print $0 "\t" count[$9]
    }'

這將gawk擴展用於與另一個進程的雙向通信

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM