如何剪切输出以仅收集文件名和获取参数?

如何剪切输出以仅收集文件名和获取参数?

我有多个带有多个链接的文件,其格式如下:

<a href="http://example.com/fnord.layername.html?parameter=FOO-_-BAR-_-FNORD" class="poit">
    <img ... />
</a>

请记住FOOBARFNORD可能有所不同。

现在我想确保所有这些文件都设置了正确的属性。为此,我想使用 ack-grep 和 cut。

ack-grep -a ?parameter= *.txt

获取输出:

fileName.txt
1:<a href="http://example.com/fnord.layername.html?parameter=FOO-_-BAR-_-FNORD" class="poit">

fileName2.txt
5:<a href="http://example.com/fnord.layername.html?parameter=POIT-_-NARF-_-BAZINGA" class="poit">

然而我完全不知道如何减少输出,这样我只会看到:

fileName.txt
parameter=FOO-_-BAR-_-FNORD

fileName2.txt
parameter=POIT-_-NARF-_-BAZINGA

答案1

您可以使用--output EXPRack-grep 的参数来有选择地仅打印该行的一部分。请记住,ack-grep 是一个 Perl 脚本,EXPR 参数只是任何 Perl 表达式;在这种情况下,我在模式匹配中使用括号来仅抓取 ? 中的行的一部分。到结束“(我还使用反斜杠来引用您没有这样做的正则表达式元字符'?',尽管可能作为正则表达式中的第一个字符可能会起作用)。

ack-grep -a --output '$1' '\?(parameter=.*?)"'

注意最后一个?正则表达式中的 .* 是非贪婪的,因此它匹配第一个 " 而不是该行的最后一个。

这会生成如下输出行- 你可以使用 ack-grep 的参数1:parameter=FOO-_-BAR-_-FNORD抑制前导 1: 。-h

答案2

ack-grep我的 Mac 上没有实用程序,那么这个awk解决方案适合您吗?

awk -v FS=[?\"] '/param/{print FILENAME; print $3 }' INPUT_FILE

执行:

[jaypal:~/Temp] cat file0
<a href="http://example.com/fnord.layername.html?parameter=FOO-_-BAR-_-FNORD" class="poit">
    <img ... />
</a>

[jaypal:~/Temp] awk -v FS=[?\"] '/param/{print FILENAME; print $3 }' file0
file0
parameter=FOO-_-BAR-_-FNORD

可能适合您的解决方法:

如果获取文件名和参数值很重要,那么您可以使用简单的命令运行它,for loop也可以将当前获取的输出重定向到文件或通过管道将其传输到下面的awk单行代码。

简单的for循环:

[jaypal:~/Temp] for i in ./file*.txt; do awk -v FS=[?\"] '/param/{print FILENAME; print $3"\n" }' "$i"; done
./file01.txt
parameter=FOO-_-BAR-_-FNORD

./file02.txt
parameter=POIT-_-NARF-_-BAZINGA

将当前输出重定向到文件并调用awk它:

以下示例假设redirection您当前输出到名为临时文件

[jaypal:~/Temp] cat temp.file 
fileName.txt
1:<a href="http://example.com/fnord.layername.html?parameter=FOO-_-BAR-_-FNORD" class="poit">

fileName2.txt
5:<a href="http://example.com/fnord.layername.html?parameter=POIT-_-NARF-_-BAZINGA" class="poit">

[jaypal:~/Temp] awk -v FS=[?\"] 'NF==1{ print $0 }/param/{ print $3"\n" }' temp.file 
fileName.txt
parameter=FOO-_-BAR-_-FNORD

fileName2.txt
parameter=POIT-_-NARF-_-BAZINGA

答案3

我不确定我是否理解,而且我也不熟悉 ack-grep 实用程序,但是为什么不尝试从第一次出现的 开始进行剪切呢?到“?

像下面这样:

出于可读性原因,我将 html 标签放在变量中

var='<a href="http://example.com/fnord.layername.html?parameter=FOO-_-BAR-_-FNORD" class="poit">'

cut -d '?' -f 2- <(echo $var ) | cut -d '"' -f 1

相关内容