![如何剪切输出以仅收集文件名和获取参数?](https://linux22.com/image/19215/%E5%A6%82%E4%BD%95%E5%89%AA%E5%88%87%E8%BE%93%E5%87%BA%E4%BB%A5%E4%BB%85%E6%94%B6%E9%9B%86%E6%96%87%E4%BB%B6%E5%90%8D%E5%92%8C%E8%8E%B7%E5%8F%96%E5%8F%82%E6%95%B0%EF%BC%9F.png)
我有多个带有多个链接的文件,其格式如下:
<a href="http://example.com/fnord.layername.html?parameter=FOO-_-BAR-_-FNORD" class="poit">
<img ... />
</a>
请记住FOO
,BAR
和FNORD
可能有所不同。
现在我想确保所有这些文件都设置了正确的属性。为此,我想使用 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 EXPR
ack-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