다음 파일 예제 1을 표시된 파일로 변환해야 합니다.실시예 2
따라서 시스템 이름과 IP가 인쇄되지만 "name"이 호스트 이름 앞에 나타나는 경우에만 해당됩니다.
- redhat03.rdns.com 10.10.29.66은 "name"이 host_name 앞에 나타나지 않기 때문에 인쇄되지 않습니다.
awk, sed 또는 perl oneliner를 통해 이 변환을 수행하는 가장 좋은 방법이 무엇인지 제안해 주십시오.
실시예 1
"name" : "REDHAT",
"host_name" : "linux01.rdns.com",
"ip" : "10.10.29.61"
"name" : "REDHAT",
"host_name" : "linux02.rdns.com",
"ip" : "10.10.29.62"
"name" : "REDHAT",
"host_name" : "linux03.rdns.com",
"ip" : "10.10.29.63"
"name" : "REDHAT",
"host_name" : "redhat01.rdns.com",
"ip" : "10.10.29.64"
"name" : "REDHAT",
"host_name" : "redhat02.rdns.com",
"ip" : "10.10.29.65"
"name" : "REDHAT",
"host_name" : "redhat03.rdns.com",
"ip" : "10.10.29.66"
"host_name" : "redhat04.rdns.com",
"ip" : "10.10.29.67"
"name" : "REDHAT",
"host_name" : "redhat05.rdns.com",
"ip" : "10.10.29.68"
"name" : "REDHAT",
"host_name" : "redhat06.rdns.com",
"ip" : "10.10.29.81"
"name" : "REDHAT",
"host_name" : "redhat07.rdns.com",
"ip" : "10.10.29.82"
"name" : "REDHAT",
"host_name" : "redhat08.rdns.com",
"ip" : "10.10.29.83"
"name" : "REDHAT",
"host_name" : "redhat09.rdns.com",
"ip" : "10.10.29.84"
기대되는 성과
linux01.rdns.com 10.10.29.61
linux02.rdns.com 10.10.29.62
linux03.rdns.com 10.10.29.63
redhat01.rdns.com 10.10.29.64
redhat02.rdns.com 10.10.29.65
redhat03.rdns.com 10.10.29.66
redhat05.rdns.com 10.10.29.68
redhat06.rdns.com 10.10.29.81
redhat07.rdns.com 10.10.29.82
redhat08.rdns.com 10.10.29.83
redhat09.rdns.com 10.10.29.84
답변1
awk
해결책:
awk '/ip/ && NR-1==h_num && NR-2==n{
r=h" "$3; gsub(/[,"]+/, "", r); print r
}
/"host_name"/{ h_num=NR; h=$3 }
/"name"/{ n=NR }' file
산출:
linux01.rdns.com 10.10.29.61
linux02.rdns.com 10.10.29.62
linux03.rdns.com 10.10.29.63
redhat01.rdns.com 10.10.29.64
redhat02.rdns.com 10.10.29.65
redhat03.rdns.com 10.10.29.66
redhat05.rdns.com 10.10.29.68
redhat06.rdns.com 10.10.29.81
redhat07.rdns.com 10.10.29.82
redhat08.rdns.com 10.10.29.83
redhat09.rdns.com 10.10.29.84
답변2
다음 내용이 awk
도움이 될 수 있습니다.
awk -F' +|:|,|"' '/"name"/{flag=1;next} flag && /"host_name"/{val1=$(NF-2);next} flag && /"ip"/{print val1,$(NF-1);flag=""}' Input_file
답변3
결과를 얻으려면 아래에서 sed oneliner를 찾으세요. 확인해보니 정상적으로 작동되네요
sed -n '/host_name/,+1p' filename | awk -F ":" '{print $2}' | sed 's/"//g' |sed "s/,//g" | sed "N;s/\n/ /g"
산출
linux01.rdns.com 10.10.29.61
linux02.rdns.com 10.10.29.62
linux03.rdns.com 10.10.29.63
redhat01.rdns.com 10.10.29.64
redhat02.rdns.com 10.10.29.65
redhat03.rdns.com 10.10.29.66
redhat04.rdns.com 10.10.29.67
redhat05.rdns.com 10.10.29.68
redhat06.rdns.com 10.10.29.81
redhat07.rdns.com 10.10.29.82
redhat08.rdns.com 10.10.29.83
redhat09.rdns.com 10.10.29.84
답변4
또 다른 awk 솔루션이 있습니다.
awk -F'|:|,|"' '/"name"/{getline; printf $5; getline; print " "$5}' file1