Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从bash中的原始数据中提取列表,或者只是格式化输出列表名称,后跟列表内容_Bash_Awk_Sed - Fatal编程技术网

从bash中的原始数据中提取列表,或者只是格式化输出列表名称,后跟列表内容

从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 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 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