grep -o搜索在第二个表达式的第一个实例处停止,而不是最后一个?贪婪?

时间:2019-12-16 13:38:58

标签: grep

不确定由谁来表达这个问题

这是示例行。

30/Oct/2019:00:17:22 +0000|v1|177.95.140.78|www.somewebsite.com|200|162512|-|-|0.000|GET /product/short-velvet-cloak-with-hood/?attribute_pa_color=dark-blue&attribute_pa_accent-color=gold&attribute_pa_size=small  HTTP/1.0|0|0|-

我需要提取attribute_pa_color=

我有

cat somewebsite.access.log.2.csv | grep -o "?.*=" > just-parameters.txt

哪个可行,但如果URL中有多个参数,则返回所有参数

因此,与其在第一个“ =”实例处停止匹配,不如在行中使用“ =”的最后实例。

如何让它从头开始停止。

我尝试过

cat somewebsite.access.log.2.csv | grep -o "?(.*?)=" > just-parameters2.txt

cat somewebsite.access.log.2.csv | grep -o "\?(.*?)=" > just-parameters2.txt

两个都不返回

我还需要每个唯一的参数,因此一旦创建了文件,我便运行了

sort just-parameters.txt | uniq > clean.txt

哪些似乎不起作用,是否可以删除重复项并将其作为相同命令的一部分?

1 个答案:

答案 0 :(得分:0)

您可以尝试使用awk

awk -F'[?&]' '{print $2}' somewebsite.access.log.2.csv|sort -u > clean.txt

如果attribute_pa_color是URL上的第一个参数,这将起作用

如果您只想提取文本attribute_pa_color=,则可以尝试以下操作:

awk -F'[?&]' '{print $2}' somewebsite.access.log.2.csv|awk -F\= '{print $1"="}'|sort -u > clean.txt

您可以尝试使用类似以下的方法来代替第二个awk

awk -F'[?&]' '{split($2,a,=);print a[1]}' somewebsite.access.log.2.csv|sort -u > clean.txt

使用awk作为分隔符在=中内部分割