使用 grep 查找和估计当前目录中 shell 脚本的总数
Using grep to find and estimate the total # of shell scripts in the current dir
UNIX 新手,目前在 class 中通过安全shell 学习 UNIX。我们已经完成了一些基本任务,例如创建循环和查找文件。我们上次的作业要求我们
write code that will estimate the number of shell scripts in the current directory and then print out that total number as "Estimated number of shell script files in this directory:"
与我们之前的作业不同,我们现在允许使用条件循环,我们被鼓励使用 grep 和 wc 语句。
在基本水平上,我知道我可以进入
ls * .sh
查找当前目录中的所有 shell 脚本。不幸的是,这不会估计总数或使用 grep。因此我的问题,我想他想让我们去
grep -f .sh (or something)
但我不确定我是否走在正确的道路上,非常感谢任何帮助。
谢谢
我会这样做:
find . -executable -execdir file {} + | egrep '\.sh: | Bourne| bash' | wc -l
- 查找当前目录 (
.
) 中的所有可执行文件。
- 对于每个文件,运行
file(1)
命令,它试图猜测它是什么类型的文件(不完美)。
- 已知模式的 Grep:以
.sh
结尾的文件名,或包含 "Bourne" 或 "bash". 的文件类型
- 计算行数。
你可以这样做:
echo "Estimated number of shell script files in this directory:" `ls *.sh | wc -l`
呼呼,有一个陷阱,.sh 文件并不总是 shell 脚本,因为扩展名不是强制性的。
告诉你这是一个 shell 脚本将是 Shebang #!/bin/*sh
(我放了一个 * 因为它可能是 bash、csh、tcsh、zsh,它们是 shells) 在行的顶部,因此提示使用 grep,所以最好的答案是:
grep '^#!/bin/.*sh' * | wc -l
这给出输出:
sensible-pager:#!/bin/sh
service:#!/bin/sh
shelltest:#!/bin/bash
smbtar:#!/bin/sh
grep 默认使用正则表达式,因此匹配 #!/bin/.*sh
将匹配以 #!/bin/
开头的行 (^
) 后跟 0 个或无限个字符 .*
然后是 sh
您可以在 http://regex101.com
上测试正则表达式并获得对它们的解释
将结果通过管道传输到 wc -l 以获取包含此内容的文件数。
要显示结果,可以在回显行中使用反引号或 $()
。
grep -l <string> *
将 return 当前目录中包含的所有文件的列表。将该输出输入 wc -l
,您就有了答案。
最简单的方法:
ls | grep .sh > tmp
wc tmp
这将打印 'tmp' 文件的行数、字节数和字符数。但是在 'tmp' 中,工作目录中的每个 *.sh 文件都有一行。因此,行数将给出您拥有的 shell 个脚本的估计数量。
wc tmp | awk '{print }' # Using awk to filter that output like...
wc -l tmp # Which it returns the number of lines follow by the name of file
但正如许多人所说,了解文件是 shell 脚本的唯一确定方法是查看第一行,看看是否有 #!/bin/bash。如果您想以这种方式开发它,请记住:
cat possible_script.x | head -n1 # That will give you the first line.
UNIX 新手,目前在 class 中通过安全shell 学习 UNIX。我们已经完成了一些基本任务,例如创建循环和查找文件。我们上次的作业要求我们
write code that will estimate the number of shell scripts in the current directory and then print out that total number as "Estimated number of shell script files in this directory:"
与我们之前的作业不同,我们现在允许使用条件循环,我们被鼓励使用 grep 和 wc 语句。
在基本水平上,我知道我可以进入
ls * .sh
查找当前目录中的所有 shell 脚本。不幸的是,这不会估计总数或使用 grep。因此我的问题,我想他想让我们去
grep -f .sh (or something)
但我不确定我是否走在正确的道路上,非常感谢任何帮助。
谢谢
我会这样做:
find . -executable -execdir file {} + | egrep '\.sh: | Bourne| bash' | wc -l
- 查找当前目录 (
.
) 中的所有可执行文件。 - 对于每个文件,运行
file(1)
命令,它试图猜测它是什么类型的文件(不完美)。 - 已知模式的 Grep:以
.sh
结尾的文件名,或包含 "Bourne" 或 "bash". 的文件类型
- 计算行数。
你可以这样做:
echo "Estimated number of shell script files in this directory:" `ls *.sh | wc -l`
呼呼,有一个陷阱,.sh 文件并不总是 shell 脚本,因为扩展名不是强制性的。
告诉你这是一个 shell 脚本将是 Shebang #!/bin/*sh
(我放了一个 * 因为它可能是 bash、csh、tcsh、zsh,它们是 shells) 在行的顶部,因此提示使用 grep,所以最好的答案是:
grep '^#!/bin/.*sh' * | wc -l
这给出输出:
sensible-pager:#!/bin/sh
service:#!/bin/sh
shelltest:#!/bin/bash
smbtar:#!/bin/sh
grep 默认使用正则表达式,因此匹配 #!/bin/.*sh
将匹配以 #!/bin/
开头的行 (^
) 后跟 0 个或无限个字符 .*
然后是 sh
您可以在 http://regex101.com
上测试正则表达式并获得对它们的解释将结果通过管道传输到 wc -l 以获取包含此内容的文件数。
要显示结果,可以在回显行中使用反引号或 $()
。
grep -l <string> *
将 return 当前目录中包含的所有文件的列表。将该输出输入 wc -l
,您就有了答案。
最简单的方法:
ls | grep .sh > tmp
wc tmp
这将打印 'tmp' 文件的行数、字节数和字符数。但是在 'tmp' 中,工作目录中的每个 *.sh 文件都有一行。因此,行数将给出您拥有的 shell 个脚本的估计数量。
wc tmp | awk '{print }' # Using awk to filter that output like...
wc -l tmp # Which it returns the number of lines follow by the name of file
但正如许多人所说,了解文件是 shell 脚本的唯一确定方法是查看第一行,看看是否有 #!/bin/bash。如果您想以这种方式开发它,请记住:
cat possible_script.x | head -n1 # That will give you the first line.