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




