【问题标题】:Using the read command within a while loop and running an awk script在 while 循环中使用 read 命令并运行 awk 脚本
【发布时间】:2021-04-13 16:51:29
【问题描述】:

我正在尝试搜索不同的文件扩展名,然后针对这些文件中的每一个运行 awk 脚本,但是终端正在寻找用户输入,我想知道它是否特定于使用 awk 脚本运行它口译员?或者这只是我在命令中做错的事情,因为我对 bash 和 awk 还比较陌生

find ./ -type f -name '\*.txt' | while  IFS= read file; do awk -f awkScript.awk "$file" done;

更新*** 我错过了一个分号,但是当我添加它并填写其余的文件扩展名时,我正在寻找它给我;

-bash: syntax error near unexpected token `done'

在这个命令上;

find ./ -type f \( -iname \*.gs -o -iname \*.pcf -o -iname \*.gr -o -iname \*.gsx -o -iname \*.en -o -iname \*.gst -o -iname \*.gosu -o -iname \*.descriptor -o -iname \*.txt \) -print0 | while  read -d $'\0' file do awk -f awkScript.awk "$file"; done;

【问题讨论】:

  • 你在done之前缺少;
  • 感谢@ArkadiuszDrabczyk。这解决了我添加到问题中的简化命令的问题,但使用完整命令创建了另一个问题。我已更新问题以包含完整命令
  • 在您的代码上添加一个 shebang 并将其粘贴到 shellcheck.net 以验证您的 shell 脚本语法
  • 这帮助我解决了我的问题。非常感谢!

标签: bash while-loop


【解决方案1】:

你确定你在做什么吗?您正在查找目录中的所有文本文件。读取这些文件中的每一个,然后将该文本文件中的每一行都视为一个文件。这是你想要的吗?

我假设你想在所有文本文件上做一些awk,可以像下面的例子那样做:

find ./ -name "*.txt" -exec awk -F. '{print $1}' {} \;

(查找所有文本文件并读取这些文件的第一列)

【讨论】:

  • 感谢@Dominique 的回答。 awk 脚本实际上是使用正则表达式来解析文件内容并在找到时返回文件中的数据,所以我试图传递每个匹配的文件的内容。我将遍历包含大量文件的非常大的文件夹,所以不想使用 exec,因为它会为每个文件创建一个新的 shell
  • 所以您正在阅读整个文件,将每一行都提供给 awk 脚本,然后才检查正则表达式?你为什么不使用grep 只显示你正在寻找的行? (我相信grep 比脚本化的while循环快得多)
  • 您知道可以使用grep 作为find 的替代品吗? grep -r <regular_expression> *.txt
  • 嗨,多米尼克,是的,我知道。我遇到的问题是,对于每个文件,我需要输出文件名、正则表达式模式、找到正则表达式的行号以及该文件中出现的次数。为了让事情变得尴尬,正则表达式需要匹配多行,例如新的 \n\n\n 文件()。所以我使用 awk 只遍历文件结构一次以捕获所有信息。
【解决方案2】:

至于您更新的命令,您仍然缺少do awk 之前的分号。
顺便说一句,您可以将命令简化为:

find . -type f -regextype posix-egrep -iregex '.*\.(gs|pcf|gr|gsx|en|gst|gosu|descriptor|txt)$' -print0 | xargs -0 awk -f awkScript.awk

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-03
    • 2018-08-28
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    相关资源
    最近更新 更多