我在CSV文件中有URL/port语句,其中一些端口语句是错误的“默认值”。
样本输入数据
http://example.com, 80
https://lookup/bin/search, 443
testecho345.unix.abc1200.org:8115,80
century.testing.external-abc03:6112,80
century.testing.external-abc03:6112,80
https://century.testing.internal-abc03:6112,443
testecho345.unix.abc1200.org:8115,80
testecho345.unix.abc1200.org:8117,80
:
后面的实际端口覆盖第2列中的“默认端口”80。http://
开头,端口应该是80,如果是https://
,端口应该是443。但是,如果明确声明了一个端口,我希望在第2栏中打印该端口。期望输出
http://example.com, 80
https://lookup/bin/search, 443
testecho345.unix.abc1200.org,8115
century.testing.external-abc03,6112
https://century.testing.internal-abc03,6112
testecho345.unix.abc1200.org,8117
我尝试使用下面的脚本,但没有得到预期的输出。
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|\.uri|\.endpoint)' 4file|sed 's/com.*/com/'|sed 's/org.*/org/'|grep '^[^#]'|sed '/.com\|.org\|10.\|17./!d'|awk '{split($0,a,"#"); print a[1]}'|awk '{split($0,a,"="); print a[1],a[2]}'|awk '{split($0,a,":"); print a[1],a[2]}'|sed -E 's/^([^:]*):([^,]*),.*$/\1,\2/'|sed 's/^\|#/,/g'|awk '/http:\/\// {print $2,80}
/https:\/\// {print $2,443}
/Points/ {print $2,"9042"}
/host/ {h=$2}
/port/ {print h,$2; h=""}'|awk -F'[, ]' '{for(i=1;i
谢谢你提前提供帮助。
发布于 2020-05-12 08:15:18
以下内容应该适用于awk
:
awk -F',' -v OFS=',' '/^http:/ {$2=80} /^https:/ {$2=443} \
$1~/:[0-9]+$/ {n=split($1,f,":"); $2=f[n]; sub(/:[0-9]+$/,"",$1);} !already[$0]++' input.txt
这将将文件解释为以逗号分隔的输入(-F','
)和输出(-v OFS=','
)。
http:
开头,则第二列将设置为80https:
开头,则第二列将设置为443。:
结尾,然后以多个数字结尾,则提取最后一部分,并将其设置为第二列的内容,同时将其从第一列中删除。already
中。只有在当前行为0的情况下,才会打印该行的内容。这使用了awk
速记法,即出现在规则之外的1
(或实际上是一个数字> 0)意味着“打印到目前为止所做的所有转换”,而0
则表示“不打印行”,而后缀++
运算符在对逻辑"NOT“进行计算后会增加出现计数。它应该与GNU awk
、mawk
和nawk
一起工作。
请注意,很少有必要将awk
、sed
和grep
组合到管道结构中;通常这三种结构中的一种能够单独执行整个任务。
https://unix.stackexchange.com/questions/586078
复制相似问题