如何用bash/awk将文件名日期作为每行首元素处理AIX df -m输出?
解决方案:关联文件名日期与文件内容输出
要实现将每个文件的日期作为每行首元素的需求,关键是逐个处理每个文件,而不是把所有文件内容混在一起处理——这样才能把文件名里的日期和对应文件的hd4数据准确对应起来。下面提供两种适用于AIX 7.2的实现方法:
方法1:Shell循环(直观易理解)
这种方法逻辑清晰,适合新手或需要灵活调整的场景:
# 先清空目标文件(避免之前的内容残留) > test1.txt # 遍历所有符合命名格式的txt文件 for file in df_command-*.txt; do # 从文件名提取日期:分割符为'-',取第2到第4段 date_part=$(echo "$file" | cut -d'-' -f2-4) # 从当前文件提取hd4的第1、2列,用逗号分隔 hd4_data=$(grep "hd4" "$file" | awk '{print $1","$2}') # 拼接日期和数据,追加到目标文件 echo "$date_part,$hd4_data" >> test1.txt done
步骤说明:
> test1.txt先清空输出文件,确保结果干净无残留for file in df_command-*.txt遍历所有符合命名规则的日志文件cut -d'-' -f2-4直接提取文件名中第2到第4段,正好是YYYY-MM-DD格式的日期- 针对每个文件,用
grep hd4定位目标行,再用awk提取需要的两列 - 把日期和数据拼接后写入输出文件
方法2:Awk单命令(更高效)
如果需要处理大量文件,用Awk一次性处理会更高效,减少进程启动开销:
awk -F'-' ' BEGIN { # 设置输出字段分隔符为逗号 OFS = "," } # 处理文件名(仅在每个文件的第一行执行) FNR == 1 { # 从文件名中提取日期部分:第2-4段 date = $2 "-" $3 "-" $4 } # 处理包含hd4的行 $0 ~ /hd4/ { # 打印日期、第一列、第二列 print date, $1, $2 } ' df_command-*.txt > test1.txt
注意事项(针对AIX环境):
AIX自带的Awk可能不支持nextfile这类GNU Awk扩展,所以上面的写法避开了该特性,确保兼容性。如果你的AIX安装了GNU Awk(gawk),可以在$0 ~ /hd4/块后加上nextfile,处理完目标行就跳过当前文件剩余内容,进一步提升速度。
最终输出效果
执行任意一种方法后,test1.txt的内容会和你期望的格式完全一致:
2019-08-28,/dev/hd4,384.00 2019-08-29,/dev/hd4,394.00 2019-08-30,/dev/hd4,354.00 2019-08-31,/dev/hd4,384.00 2019-09-01,/dev/hd4,484.00 2019-09-02,/dev/hd4,324.00 2019-09-03,/dev/hd4,384.00
内容的提问来源于stack exchange,提问作者Makmy
相关产品推荐
相关产品推荐

