Bash 在while循环中使用read命令并运行awk脚本
我试图搜索不同的文件扩展名,然后对每个文件运行一个awk脚本,但是终端正在寻找用户输入,我想知道这是否是特定于使用awk脚本作为解释器运行的?还是因为我对bash和awk还比较陌生,所以我的命令有误Bash 在while循环中使用read命令并运行awk脚本,bash,while-loop,Bash,While Loop,我试图搜索不同的文件扩展名,然后对每个文件运行一个awk脚本,但是终端正在寻找用户输入,我想知道这是否是特定于使用awk脚本作为解释器运行的?还是因为我对bash和awk还比较陌生,所以我的命令有误 find ./ -type f -name '\*.txt' | while IFS= read file; do awk -f awkScript.awk "$file" done; 更新*** 我遗漏了一个分号,但当我添加这个并填写我正在寻找的其他文件扩展名时,请给我 -
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;
你确定你在做什么吗?您正在查找目录中的所有文本文件。读取这些文件中的每一个,然后将该文本文件中的每一行视为一个文件。这是你想要的吗 我假设您希望对所有文本文件执行一些
awk
,可以按照以下示例执行:
find ./ -name "*.txt" -exec awk -F. '{print $1}' {} \;
(查找所有文本文件并读取这些文件的第一列)您确定要做什么吗?您正在查找目录中的所有文本文件。读取这些文件中的每一个,然后将该文本文件中的每一行视为一个文件。这是你想要的吗 我假设您希望对所有文本文件执行一些
awk
,可以按照以下示例执行:
find ./ -name "*.txt" -exec awk -F. '{print $1}' {} \;
(查找所有文本文件并读取这些文件的第一列)至于更新的命令,在
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
至于更新的命令,在
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
您缺少
代码>在完成之前
谢谢@ArkadiuszDrabczyk。这通过我添加到问题中的简化命令解决了问题,但通过完整命令创建了另一个问题。我已经更新了这个问题以包含完整的命令在代码上添加一个shebang并粘贴到以验证您的shell脚本语法这帮助我解决了我的问题。非常感谢!您缺少代码>在完成之前
谢谢@ArkadiuszDrabczyk。这通过我添加到问题中的简化命令解决了问题,但通过完整命令创建了另一个问题。我已经更新了这个问题以包含完整的命令在代码上添加一个shebang并粘贴到以验证您的shell脚本语法这帮助我解决了我的问题。非常感谢!谢谢你的回答@Dominique。awk脚本实际上使用正则表达式来解析文件内容,并在找到数据时返回文件中的数据,因此我尝试传递匹配的每个文件的内容。我将迭代包含大量文件的非常大的文件夹,所以不想使用exec,因为它将为每个文件创建一个新的shell。因此,您正在读取整个文件,为awk脚本提供每一行,然后才检查正则表达式?为什么不使用grep
仅显示您要查找的行?(我相信grep
比编写脚本的while循环快得多)您知道可以使用grep
作为查找
的替代方案吗<代码>grep-r*.txt
你好,多米尼克,是的,我知道。我的问题是,对于每个文件,我需要输出文件名、正则表达式模式、正则表达式所在的行号以及该文件中出现的行数。要使事情变得棘手,正则表达式需要在多行上进行匹配,例如,对于new\n\n File()。因此,我使用awk只对文件结构进行一次迭代,以捕获所有信息。感谢您的回答@Dominique。awk脚本实际上使用正则表达式来解析文件内容,并在找到数据时返回文件中的数据,因此我尝试传递匹配的每个文件的内容。我将迭代包含大量文件的非常大的文件夹,所以不想使用exec,因为它将为每个文件创建一个新的shell。因此,您正在读取整个文件,为awk脚本提供每一行,然后才检查正则表达式?为什么不使用grep
仅显示您要查找的行?(我相信grep
比编写脚本的while循环快得多)您知道可以使用grep
作为查找
的替代方案吗<代码>grep-r*.txt
你好,多米尼克,是的,我知道。我的问题是,对于每个文件,我需要输出文件名、正则表达式模式、正则表达式所在的行号以及该文件中出现的行数。要使事情变得棘手,正则表达式需要在多行上进行匹配,例如,对于new\n\n File()。因此,我使用awk只在文件结构上迭代一次,以捕获所有信息。