You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

步骤说明:

  1. > test1.txt 先清空输出文件,确保结果干净无残留
  2. for file in df_command-*.txt 遍历所有符合命名规则的日志文件
  3. cut -d'-' -f2-4 直接提取文件名中第2到第4段,正好是YYYY-MM-DD格式的日期
  4. 针对每个文件,用grep hd4定位目标行,再用awk提取需要的两列
  5. 把日期和数据拼接后写入输出文件

方法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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:25:54