【问题标题】:Is there a way to use regex with awk to execute a command only when the pattern is matched?有没有办法仅在模式匹配时使用带有 awk 的正则表达式来执行命令?
【发布时间】:2020-05-27 09:25:22
【问题描述】:

我正在尝试编写一个获取用户输入的 bash 脚本,检查包含该输入的行的 .txt,然后将其插入 wget 语句以开始下载。

在测试功能时,awk 似乎打印出每一行,而不仅仅是模式匹配的行。

chosen=DSC01985
awk -v c="$chosen" 'BEGIN {FS="/"; /c/}
{print  $8, "found", c}
END{print " done"}' ./imgLink.txt

以上内容应取自 imgLink.txt,搜索模式并返回找到模式。相反,它会打印文件中每一行的第 8 个字段。

我尝试将 /c/ 从 begin 语句中移出,但无济于事。

这是怎么回事?

示例输入:

https://xxxx/xxxx/xxxx/xxxx/xxx/DSC01533.jpg

https://xxxx/xxxx/xxxx/xxxx/xxx/DSC01536.jpg

https://xxxx/xxxx/xxxx/xxxx/xxx/DSC01543.jpg

https://xxxx/xxxx/xxxx/xxxx/xxx/DSC01558.jpg

https://xxxx/xxxx/xxxx/xxxx/xxx/DSC01565.jpg 等等

示例输出:

...

找到DSC02028.jpg DSC01985

找到DSC02030.jpg DSC01985

找到DSC02032.jpg DSC01985

找到DSC02038.jpg DSC01985

找到 DSC02042.jpg DSC01985 等等

【问题讨论】:

  • 欢迎来到 SO 并特别感谢您在问题中表现出的努力。请在您的问题中发布输入示例和预期示例输出以便更好地理解,请编辑您的问题并让我们知道。
  • 问题友好编辑,如果您需要任何进一步的信息,很乐意提供帮助

标签: regex linux awk wget


【解决方案1】:

您的尝试很接近,您无法搜索像 /var/ 这样的 awk 变量,您需要不同的方法。您能否尝试关注。考虑到您想要查看的字符串将出现在您当前在帖子中xxxed 的 URL 值中。

awk -v c="$chosen" -F'/' '$0 ~ c{print $NF " found " c}' Input_file

不知道为什么在 END 块中写了done,如果需要,可以在此处添加。另外$NF 表示当前行的最后一个字段,您也可以根据需要打印它。

【讨论】:

  • 好吧,太棒了。所以这很有效但是我可以大胆地问几个问题来加深我的理解:1)-F'F' vs 'Begin {FS="/"} 2)$NF vs $8 3) /[pattern] / vs ~ 4)似乎关键是正则表达式与表达式在同一行?这是正义和愚蠢的主义吗?
  • @plebert,通过-FFS=" 方法设置字段分隔符或多或少相同,您可以使用它们中的任何一个。如果您在 /..../ 中提及任何内容,则搜索内容将被视为正则表达式,并将查找该匹配项(而不是其值的匹配项),因此必须以这种方式使用它,在这个伟大的论坛上欢呼并快乐学习所以。
猜你喜欢
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 2023-03-17
相关资源
最近更新 更多