Nig*_*ard 7 grep shell-script filenames whoami
我目前正在通过一些练习来尝试改进我的 shell 脚本。脚本要求如下:
- 它必须使用
whoami
命令获取用户名并将其存储在名为 的变量中username
。- 它必须采用单个参数,即要搜索的文件的名称。
- 它必须
grep
在指定的文件中搜索用户名的出现并打印它们。
这部分相对简单,我使用以下内容使其工作:
username=$(whoami)
echo 'Enter the name of the file you would like to search: '
read fileName
cat "fileName" | grep "$username"
Run Code Online (Sandbox Code Playgroud)
但是有一个问题,该练习指出以下内容:
注意:对于此任务,无需担心缺少错误检查参数。除了shebang 和您选择添加的任何注释之外,脚本应该由两行组成。
如何将其减少到只有两行?
Kus*_*nda 10
文件的路径名作为参数给出。这意味着它是在脚本的命令行上给出的。这意味着您不应该以交互方式向用户询问它。
#!/bin/sh
grep -wF -e "$LOGNAME" "$1"
Run Code Online (Sandbox Code Playgroud)
或者,如果您真的想使用whoami
:
#!/bin/sh
grep -wF -e "$(whoami)" "$1"
Run Code Online (Sandbox Code Playgroud)
或者,对于“两行”要求:
#!/bin/sh
name=$(whoami) # or: name=$LOGNAME
grep -wF -e "$name" "$1"
Run Code Online (Sandbox Code Playgroud)
或者,如果我们想在第一行做一些有用的事情:
#!/bin/sh
[ ! -f "$1" ] && { printf 'No such file: %s\n' "$1" >&2; exit 1; }
grep -wF -e "$(whoami)" "$1"
Run Code Online (Sandbox Code Playgroud)
使其仅匹配完整单词的-w
选项grep
。 grep -w 'AA'
会匹配AA
但不匹配AAA
。
该-F
选项grep
使公用事业采取定表达式作为一个固定的字符串,并没有为正则表达式。
该-e
选项表示命令行上的下一个字符串是模式。没有它,以破折号开头的模式可能会被错误地解释为一组命令行选项。
的$LOGNAME
(或$USER
在许多系统)变量保持当前用户的用户名。
的值$1
是在命令行上提供给脚本的第一个命令行参数。
还要注意,我们可以用/bin/sh
而不是bash
用来执行这个,因为这个脚本没有使用特殊的bash
特定外壳扩展。它显然也可以在bash
......
请注意,上述内容不会搜索提及特定用户的文件(如问题标题所示),而是搜索文件中提及该用户的行。
要在命令行给出的目录中搜索提及当前用户的文件:
#!/bin/sh
find "$1" -type f -exec grep -q -wF -e "$LOGNAME" {} ';' -print
Run Code Online (Sandbox Code Playgroud)
与最后一部分相关:
man grep
在你的系统上。