파일 이름:hello1
cassandraDriver.contactPoints=10.65.4.203,10.65.4.220
cassandraDriver.port=9042
파일 이름:hello2
cassandraDriver.contactPoints=10.65.4.203
cassandraDriver.port=80
onprem.cassandra.contactPoints= 10.135.83.48
cassandraDriver.port=8080
onprem.cassandra.contactPoints:10.5.14.20
예상 출력:
host port filename
10.65.4.203 9042 hello1,hello2
10.65.4.220 9042 hello1
10.135.83.48 8080 hello2
10.5.14.20 hello2
동일한 호스트와 포트가 반복되어서는 안 됩니다.
아래는 호스트와 포트를 가져오기 위해 작성한 스크립트입니다.
#!/bin/bash
stty -echo
if [[ $# -ne 1 ]]; then
echo "\nPlease call '$0 <repo name>' to run this command!\n"
exit 1
fi
#echo "Cloning the repository $1"
git clone ww.abc.com
cd $1
#echo "Checking the files ... "
for file in $(git ls-files);
do
#echo " --$file -- ";
grep -P '((?<=[^0-9.]|^)[1-9][0-9]{0,2}(\.([0-9]{0,3})){3}(?=[^0-9.]|$)|(http|ftp|https|ftps|sftp)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?|\.port|\.host|contact-points|contactPoints|\.uri)' $file | grep '^[^#]' | awk '{split($0,a,"="); print a[2]}';
done | awk '!_[$0]++'
#echo "Done."
stty echo
cd ..
#rm -rf $1
누구든지 예상되는 결과를 얻을 수 있도록 도와줄 수 있나요?
답변1
당신이 요구하는 것이 무엇인지는 확실하지 않지만 아마도 이것이 당신이 원하는 것일 것입니다(GNU awk를 사용하는 배열의 배열):
$ cat tst.awk
BEGIN { FS="[[:space:]]*[,:][[:space:]]*"; OFS="\t" }
{ sub(/^[^=:]*[=:][[:space:]]*/,"") }
NR%2 { split($0,hosts); next }
{
for (i in hosts) {
host = hosts[i]
for (i=1; i<=NF; i++) {
exists[host][$i][FILENAME]
}
}
}
END {
print "host", "port", "filename"
for (host in exists) {
for (port in exists[host]) {
printf "%s%s%s%s", host, OFS, port, OFS
sep = ""
for (filename in exists[host][port]) {
printf "%s%s", sep, filename
sep = ","
}
print ""
}
}
}
.
$ awk -f tst.awk hello1 hello2
host port filename
10.12.17.18 8934 hello2
10.5.14.20 1234 hello1,hello2
10.5.14.20 8934 hello2
10.5.67.8 8934 hello2
10.11.12.203 1234 hello1
.
$ awk -f tst.awk hello1 hello2 | column -s$'\t' -t
host port filename
10.12.17.18 8934 hello2
10.5.14.20 1234 hello1,hello2
10.5.14.20 8934 hello2
10.5.67.8 8934 hello2
10.11.12.203 1234 hello1