You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Red Hat 4-5系统中打印/tmp目录下每个文件除最后20行外的内容?

嘿,在RHEL 4/5环境下要实现打印/tmp目录下每个文件除最后20行外的内容,我有两个实用方案,看你系统里的工具版本选就行:

方案1:使用head命令(简洁高效)

如果你的系统coreutils版本支持负数行参数(RHEL 5大概率支持,RHEL 4部分版本也支持),head -n -20可以直接输出文件除最后20行的内容。结合循环遍历/tmp下的普通文件:

for file in /tmp/*; do
  # 只处理普通文件,跳过子目录、设备文件等
  if [ -f "$file" ]; then
    echo "=== 正在处理文件: $file ==="
    head -n -20 "$file"
  fi
done

要是需要递归处理/tmp下所有子目录里的文件,用find更方便:

find /tmp -type f -exec sh -c 'echo "=== 正在处理文件: {} ==="; head -n -20 {}' \;
方案2:使用sed命令(兼容老版本)

如果你的head不支持负数行参数(比如某些极老的RHEL 4版本),sed是更稳妥的选择,有两种写法:

写法1:纯sed实现(无需额外计算行数)

这种写法不用先统计总行数,直接通过sed的模式匹配去掉最后20行,适合大文件:

for file in /tmp/*; do
  if [ -f "$file" ]; then
    echo "=== 正在处理文件: $file ==="
    sed -n ":a;N;\$!ba;s/\n/&\n/20g;s/\n.*$//" "$file"
  fi
done

写法2:先统计总行数再输出

这种写法更直观,先算出文件总行数,当行数大于20时输出前总行数-20行,否则直接输出全部内容:

for file in /tmp/*; do
  if [ -f "$file" ]; then
    echo "=== 正在处理文件: $file ==="
    total_lines=$(wc -l < "$file")
    if [ "$total_lines" -gt 20 ]; then
      sed -n "1,$((total_lines-20))p" "$file"
    else
      echo "文件行数不足20行,输出全部内容:"
      cat "$file"
    fi
  fi
done
额外注意事项
  • 如果需要处理/tmp下的隐藏文件(以.开头的文件),把循环里的/tmp/*改成/tmp/{*,.*},但要排除...两个特殊目录:
for file in /tmp/{*,.*}; do
  if [ -f "$file" ] && [ "$file" != "/tmp/." ] && [ "$file" != "/tmp/.." ]; then
    # 插入上面的处理逻辑即可
  fi
done
  • 对于超大文件,纯sed的写法比先统计行数的方式效率更高,因为不需要额外读取一遍文件统计行数。

内容的提问来源于stack exchange,提问作者Trap29

火山引擎 最新活动