首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用whoami搜索提到用户的文件

使用whoami搜索提到用户的文件
EN

Unix & Linux用户
提问于 2018-10-08 10:53:44
回答 2查看 8.1K关注 0票数 7

我目前正在进行一些练习,试图改进我的shell脚本。该脚本的要求如下:

  1. 它必须使用whoami命令获取用户名,并将其存储在一个名为username的变量中。
  2. 它必须接受一个参数,它是要搜索的文件的名称。
  3. 它必须通过grep搜索指定文件中出现的用户名,并打印它们。

这个部分相对简单,我使用了以下方法来使其工作:

代码语言:javascript
复制
username=$(whoami)
echo 'Enter the name of the file you would like to search: '
read fileName
cat "fileName" | grep "$username"

然而,有一个陷阱,该练习声明如下:

注意:对于此任务,不需要担心错误检查缺少参数。除了shebang和您选择添加的任何注释之外,脚本应该由两行组成。

我怎样才能把这个减少到两行呢?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2018-10-08 11:03:52

文件的路径名作为参数给出。这意味着它是在脚本的命令行中给出的。这意味着您不应该以交互方式向用户询问。

代码语言:javascript
复制
#!/bin/sh
grep -wF -e "$LOGNAME" "$1"

或者,如果您真的想使用whoami

代码语言:javascript
复制
#!/bin/sh
grep -wF -e "$(whoami)" "$1"

或者,对于“两行”要求:

代码语言:javascript
复制
#!/bin/sh
name=$(whoami)  # or:  name=$LOGNAME
grep -wF -e "$name" "$1"

或者,如果我们想在第一行做一些有用的事情:

代码语言:javascript
复制
#!/bin/sh
[ ! -f "$1" ] && { printf 'No such file: %s\n' "$1" >&2; exit 1; }
grep -wF -e "$(whoami)" "$1"

-w选项grep使其只匹配完整的单词。grep -w 'AA'将与AA相匹配,但不会与AAA相匹配。

-F选项使grep实用程序将给定表达式视为固定字符串,而不是正则表达式。

-e选项表示命令行上的下一个字符串是模式。没有它,以破折号开头的模式可能会被错误地解释为一组命令行选项。

$LOGNAME (或许多系统上的$USER )变量保存当前用户的用户名。

$1的值是给命令行上的脚本的第一个命令行参数。

还请注意,我们可以使用/bin/sh而不是bash来执行这一点,因为这个脚本没有使用特殊的bash-specific shell扩展。很明显,它在bash下运行得也很好.

请注意,上面没有搜索提到特定用户的文件(如问题的标题),而是搜索提到该用户的文件中的行。

要搜索命令行上给定的目录中提到当前用户的文件,请执行以下操作:

代码语言:javascript
复制
#!/bin/sh
find "$1" -type f -exec grep -q -wF -e "$LOGNAME" {} ';' -print

与最后一部分有关:

票数 10
EN

Unix & Linux用户

发布于 2018-10-08 11:08:04

最简单的解决办法:

代码语言:javascript
复制
#!/bin/bash
username=$(whoami)
grep $username $1

您可以为grep提供一个文件名作为可选参数(请参阅man grep)。变量$1引用脚本的第一个位置参数。

你这样称呼它:

代码语言:javascript
复制
name-finder.sh filename

你甚至可以把它做成一条线:

代码语言:javascript
复制
username=$(whoami); grep $username $1

代码语言:javascript
复制
grep $(whoami) $1
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/473947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档