从bash中的原始数据中提取列表,或者只是格式化输出列表名称,后跟列表内容
原始数据有“pool pool_name”,然后后跟0-n行数“member arbitral_member_ip”是否可以在bash中创建拾取列表?我尝试了一些if条件,直到我累了。提前谢谢你的帮助从bash中的原始数据中提取列表,或者只是格式化输出列表名称,后跟列表内容,bash,awk,sed,Bash,Awk,Sed,原始数据有“pool pool_name”,然后后跟0-n行数“member arbitral_member_ip”是否可以在bash中创建拾取列表?我尝试了一些if条件,直到我累了。提前谢谢你的帮助 pool string_name_1 member 172.0.0.1 member 172.0.1.1 pool string_name_2 member 172.2.1.2 member 172.0.2.2 pool str
pool string_name_1
member 172.0.0.1
member 172.0.1.1
pool string_name_2
member 172.2.1.2
member 172.0.2.2
pool string_name_3
member 172.2.1.3
member 172.3.2.3
member 172.25.25.3
member 172.25.40.3
pool string_name_4
pool string_name_5
member 5.5.50.5
预期结果
string_name_1 172.0.0.1 172.0.1.1
string_name_2 172.2.1.2 172.0.2.2
string_name_3 172.2.1.3 172.3.2.3 172.25.25.3 172.25.40.3
string_name_4
string_name_5 5.5.50.5
这将默认的
RS
更改为pool
,因此每个记录现在都由pool
分隔gsub()
用于从输出中删除成员
字符串
awk -v RS='pool' '{$1=$1;gsub(/member/,"")}1' inputfile
string_name_1 172.0.0.1 172.0.1.1
string_name_2 172.2.1.2 172.0.2.2
string_name_3 172.2.1.3 172.3.2.3 172.25.25.3 172.25.40.3
string_name_4
string_name_5 5.5.50.5
有了bash,你就可以写作了
unset line
while read -r key value; do
case $key in
pool) [[ $line ]] && echo "$line"; line=$value ;;
member) line+=" $value" ;;
esac
done < file
echo "$line"
进入下一步:使用“member”作为字段分隔符:
awk-F'\nmember'-v RS='pool'{$1=$1;printf”%s',$0}'文件
以上假设行实际上不是以空格开头的。这里1表示True,因此awk将继续执行默认操作。这是印刷品。使用任何非零值来代替零。@JBone,1在awk标记信息页面上有非常详细的解释:@glennjackman..明白了,因为非零值等于true,那么awk“1”文件指示awk对每一行执行默认操作(打印)。
awk '
$1 == "pool" {if (line) print line; line = $2}
$1 == "member" {line = line OFS $2}
END {print line}
' file