如何调整Shell脚本输出格式,实现单任务信息单行展示?
调整Shell脚本输出格式
问题描述
现有如下Shell脚本:
#!/bin/bash while read -r i; do autorep -j $i -q | grep -e insert_job -e date_conditions -e condition | awk '{print ($2,$4,$6)}' echo done
执行后输出为:
Test_Kill CMD 0 Test_Karthik CMD 0 Test_Ujjal CMD 0 Test1 CMD 0
修改脚本为:
#!/bin/bash while read -r i; do autorep -j $i -q | grep -e insert_job -e date_conditions -e condition | awk 'BEGIN { ORS=" " }; {print ($2,$4,$6)}' echo done
输出变为:
Test_Kill CMD 0 Test_Karthik CMD 0 Test_Ujjal CMD 0 Test1 CMD 0
期望实现的输出格式:
Test_Kill CMD 0 Test_Karthik CMD 0 Test_Ujjal CMD 0 Test1 CMD 0
补充:autorep -j test_ujjal -q的输出示例:
/* ----------------- test_ujjal ----------------- */ insert_job: test_ujjal job_type: CMD command: echo machine: vservername owner: owner permission: date_conditions: 0 description: "test job" alarm_if_fail: 0 alarm_if_terminated: 0
解决方案
直接用awk一次性处理autorep的输出,避免多次管道拆分内容,脚本如下:
#!/bin/bash while read -r i; do autorep -j "$i" -q | awk ' /insert_job/ { job = $2; job_type = $4 } /date_conditions/ { dc_val = $2 } END { print job, job_type, dc_val } ' done
解释
- 去掉多余的
grep,让awk直接过滤目标行:- 匹配
insert_job行时,提取第2个字段(任务名)和第4个字段(任务类型)并保存到变量 - 匹配
date_conditions行时,提取第2个字段(条件值)保存到变量
- 匹配
- 每个任务的输出处理完成后,在
END块把三个变量的值打印在一行,自然实现每个任务占一行的格式 - 给
$i加上双引号,避免任务名含特殊字符时出现问题
内容的提问来源于stack exchange,提问作者NecroCoder
相关产品推荐
相关产品推荐

