Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在while循环中使用read命令并运行awk脚本_Bash_While Loop - Fatal编程技术网

Bash 在while循环中使用read命令并运行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; 更新*** 我遗漏了一个分号,但当我添加这个并填写我正在寻找的其他文件扩展名时,请给我 -

我试图搜索不同的文件扩展名,然后对每个文件运行一个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;

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

我假设您希望对所有文本文件执行一些
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只在文件结构上迭代一次,以捕获所有信息。