linux - 编写 Linux Bash 脚本,根据行中的字数打印 grep 输出
问题描述
我正在尝试为 bash shell 编写脚本。我得到了4个参数:
- 目录的路径
- 文件的扩展名
- 一个字
- 一个号码
我必须查找路径的子目录的所有文件和文件,以查找具有给定扩展名的文件。然后,在文件中查找与给定单词匹配的行,但前提是该行中的单词数大于或等于提供的数字。
例如:
如果localDirectory
有:image.png script.sh text.txt
。
并且text.txt
有:
This is a text file
It contains many words
This is an example for a simple text file
然后给出命令:./example.sh localDirectory txt text 7
我应该输出:This is an example for a simple text file
。
目前,我的脚本如下所示:
if [ "$#" -ne 4 ];
then
echo "Not enough parameters"
exit 1
fi
find $1 -name "*.$2" -exec grep -wi $3 {} \;
对于前 3 个目标,它工作得很好,我只是不知道现在如何过滤结果,使得该行的单词数大于或等于 $4。
我当然可以创建一个新文件并在那里输出,然后从中读取并仅打印相关行,但我宁愿这样做而不创建新文件。
我对 shell 脚本很陌生。
有任何想法吗?
解决方案
使用awk
以便您可以测试NF
(行中的字段数)。
还要记住引用所有变量。
find "$1" -name "*.$2" -exec awk -v word="${3,,}" -v count="$4" 'NF >= count && tolower($0) ~ word' {} +
${3,,}
转换$3
为小写,tolower($0)
并将文件行转换为小写,因此比较它们使其不区分大小写。
推荐阅读
- go - 强制重新下载/完全清洁环境
- c# - 使用 CSOM 对 Sharepoint Online 进行身份验证
- php - 如何在 PHP 中使用相同的键从另一个数组向数组的键添加值?
- javascript - 默认选择 Html 按钮
- delphi - 德尔福手机菜单
- java - 微调器项目取决于另一个微调器的选定项目
- nginx - 重新定向 NGINX - 我正在做的事情没有效果
- ionic-framework - 任务“:CordovaLib:compileDebugAidl”执行失败
- java - 即使服务启动,CircuitBreakerOpenException
- spring - Spring:JDBCTemplate 没有正确注入