[英]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.