awk:排除模式,仅匹配表达式,排序,uniq

时间:2015-09-07 16:31:18

标签: regex bash sorting awk uniq

我正在尝试处理500,000行文字。我的代码在下面有效,但对我来说似乎非常不足。我想通过用awk完成这个来测试这个理论,看看我是否有任何节省时间。使用各种变量通过我的脚本复制此代码块。这里节省的时间相当于脚本结束时节省的10倍。但是,我真的很难用awk来实现这个目标。

脚本:

_regex_ipv4_ip_='((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])'

_regex_ipv4_cidr_='(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))'

grep -v '^#' ${tmp}/url_* | grep -Eho "${_regex_ipv4_ip_}|${_regex_ipv4_cidr_}" | sort | uniq >${tmp}/ipv4

我怎么样,只有awk ...... 搜索多个文件。 排除的线条匹配模式。 将bash变量带入awk。 使用正则表达式模拟'grep -o'。 排序结果(如果在bash中'uniq'只需要排序,请小心) 模仿uniq 将结果写入文件

输入文件看起来像这样

#Comment
http://192.168.0.1/whatever #Comment
192.168.0.1
http://192.168.0.1/whatever/whatever
192.168.0.1 #Comment
192.168.0.0/16
192.168.0.0/16 #Comment

重复删除后的输出......

  

192.168.0.1   192.168.0.0/16

更新:1

这是我现在的位置......

这也是我想要的方式......

_regex_ipv4_ip_='192.168.0.1'
_regex_ipv4_cidr_='192.168.0.0/16'

awk -v exclude='#' -v include="${_regex_ipv4_ip_}" -v include2="${_regex_ipv4_cidr_}" '($0 !~ exclude) && match($0,include) && !seen[substr($0,RSTART,RLENGTH)]++ || match($0,include2) && !seen[substr($0,RSTART,RLENGTH)]++' /home/master/Desktop/t_*

但是我无法正确地将包含在变量中的正则表达式正确地传递给awk。

_regex_ipv4_ip_='((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])'
_regex_ipv4_cidr_='(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))'

1 个答案:

答案 0 :(得分:3)

你想要的是:

awk -v exclude='whatever' -v include='whatever' '
($0 !~ exclude) && match($0,include) && !seen[substr($0,RSTART,RLENGTH)]++
' file1 file2 ... fileN

但是在您发布样本输入/输出之前,我们无法填写详细信息。