求助编写Linux单行grep命令:筛选文件并按修改时间排序输出指定格式
解决方案:单行命令实现需求
直接给你能满足需求的单行命令,我会一步步拆解每个部分的作用:
grep -il "SmapleString" *.log | xargs ls -lt | awk '{size=$5/1024/1024; printf "%s %s %s %s %.1fMB\n", $6, $7, $8, $9, size}' | head -15
如果想要把文件大小放在最前面,调整printf的顺序即可:
grep -il "SmapleString" *.log | xargs ls -lt | awk '{size=$5/1024/1024; printf "%.1fMB %s %s %s %s\n", size, $6, $7, $8, $9}' | head -15
各部分解析:
grep -il "SmapleString" *.log:遍历当前目录下所有.log文件,找出包含SmapleString的文件。-i会忽略大小写(如果不需要精确匹配大小写,去掉这个参数就行),-l只输出匹配到的文件名,避免输出冗余的文件内容。xargs ls -lt:把grep输出的文件名传给ls命令,-lt参数让文件按修改时间从新到旧排序,这样最近修改的文件会排在最前面,正好契合你要“最近修改的前15个”的需求。awk '{size=$5/1024/1024; printf "..."}':这一步是核心,用来把ls输出的字节数(第5列)转换成MB单位。$5/1024/1024把字节转成二进制MB(如果要按十进制MB计算,换成$5/1000/1000即可),然后用printf按你想要的格式输出时间、文件名和转换后的大小。head -15:直接取排序后的前15个结果,也就是最近修改的15个文件。
为什么比你尝试的命令更合适?
你之前用tr -s ' ' | cut -d' ' -f5-9|tail -r|head -15的方式,不仅步骤繁琐,还没法直接把字节转成MB。用awk可以一步完成格式调整和单位转换,而且ls -lt直接按新到旧排序,不需要再反转结果,效率更高。
内容的提问来源于stack exchange,提问作者siddhartha




