处理包含 URL 的 CSV 文件,以用明确指定的端口替换可能错误的“默认”端口

处理包含 URL 的 CSV 文件,以用明确指定的端口替换可能错误的“默认”端口

我在 CSV 文件中有 URL/端口语句,其中某些端口语句是错误的“默认”值。

输入数据示例

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
  • 如果 URL 中明确指定了端口号,我想用 .txt 文件后面所述的实际端口覆盖第 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<NF;i++){print $i,$NF}}'|awk 'BEGIN{OFS=","} {$1=$1} 1'|sed '/^[0-9]*$/d'|awk -F, '$1 != $2'|sed -E 's_^https?://__'
done |awk '!a[$0]++

提前谢谢你的帮助。

答案1

以下应该适用于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:,第二列将设置为 80
  • 如果一行以 开头https:,第二列将设置为 443
  • 在所有行中(包括已经由前面的规则处理的行),如果第一个字段以 和 结尾,:然后超过一个数字,则提取最后一部分并将其设置为第二列的内容,同时将其从第一列中删除。
  • 每行的出现次数将被记录在数组中already。仅当当前行为 0 时,才会打印该行的内容。这利用了速记符号,即出现在规则之外的awka (或实际上是一个数字 > 0)表示“打印包括迄今为止所做的所有转换的行”,而 a表示“不打印该行”,并且后缀运算符增加出现次数10++它被评估为逻辑“NOT”。

它应该与 GNU和一起工作awkmawknawk

请注意,很少需要在管道结构中组合awk,sed和;grep通常,三人之一能够独自完成整个任务。

相关内容