如何将grep统计结果转为日期+逗号分隔格式写入CSV?
解决方案
我来帮你搞定这个需求,咱们一步步拆解实现:
1. 先拿到前一天的日期
不同系统的日期命令有点差异,分两种情况处理:
- Linux系统:用
date -d指定“昨天”,同时按你要的格式输出:# 带前导零的格式(比如05/21/2018) yesterday=$(date -d "yesterday" +%m/%d/%Y) # 不带前导零的格式(比如5/21/2018) yesterday=$(date -d "yesterday" +%-m/%-d/%Y) - macOS系统:macOS的
date用-v参数调整日期:# 带前导零 yesterday=$(date -v -1d +%m/%d/%Y) # 不带前导零 yesterday=$(date -v -1d +%-m/%-d/%Y)
2. 提取grep统计的数字并格式化
你的原命令输出是150 abc 130 def,我们需要把里面的数字提出来,用逗号连起来。用awk和paste就能轻松搞定:
counts=$(grep -EIho 'abc|def' * | sort | uniq -c | awk '{print $1}' | paste -sd ",")
简单解释下:
awk '{print $1}':把每一行的第一个字段(也就是统计的数字)单独拎出来paste -sd ",":把所有数字用逗号拼接成150,130的格式
3. 拼接内容写入文件
把日期和统计结果拼成你要的格式,追加到counts.csv里:
echo "$yesterday $counts" >> counts.csv
完整可执行脚本
把上面的步骤整成脚本,直接运行就行:
Linux版本
#!/bin/bash # 获取前一天日期(不带前导零) yesterday=$(date -d "yesterday" +%-m/%-d/%Y) # 统计并格式化数字 counts=$(grep -EIho 'abc|def' * | sort | uniq -c | awk '{print $1}' | paste -sd ",") # 写入文件 echo "$yesterday $counts" >> counts.csv
macOS版本
#!/bin/bash # 获取前一天日期(不带前导零) yesterday=$(date -v -1d +%-m/%-d/%Y) # 统计并格式化数字 counts=$(grep -EIho 'abc|def' * | sort | uniq -c | awk '{print $1}' | paste -sd ",") # 写入文件 echo "$yesterday $counts" >> counts.csv
额外小提示
如果担心sort后的顺序不稳定(比如有时候def会排在abc前面),导致数字顺序搞反,那可以单独统计每个关键词,这样更稳妥:
count_abc=$(grep -EIho 'abc' * | wc -l) count_def=$(grep -EIho 'def' * | wc -l) counts="$count_abc,$count_def"
这样不管什么情况,abc的数量始终在前,def在后,完全符合你的格式要求。
内容的提问来源于stack exchange,提问作者Gha1d
相关产品推荐
相关产品推荐

