我正在尝试处理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]))'
答案 0 :(得分:3)
你想要的是:
awk -v exclude='whatever' -v include='whatever' '
($0 !~ exclude) && match($0,include) && !seen[substr($0,RSTART,RLENGTH)]++
' file1 file2 ... fileN
但是在您发布样本输入/输出之前,我们无法填写详细信息。