【问题标题】:Bash: grep pattern from command outputBash:来自命令输出的 grep 模式
【发布时间】:2012-05-04 02:06:47
【问题描述】:

我对 bash 很陌生,但它是学校的科目之一。其中一项练习是:

提供您自己的登录信息所在的文件“/etc/passwd”的行号。

假设USERNAME是我自己的登录ID,我可以这样完美地做到:

 cat /etc/passwd -n | grep USERNAME | cut -f1

这只是给出了所需的行号(可能有更优化的方式)。然而,我想知道是否有办法使命令更通用,以便它使用whoami 的输出来表示 grep 模式,无需编写脚本或使用变量。换句话说,为了让它成为一个易于阅读的单行命令,就像这样:

 cat /etc/passwd -n | grep (whoami) | cut -f1

对不起,如果这是一个真正的菜鸟问题。

【问题讨论】:

    标签: bash unix grep pipe


    【解决方案1】:

    您可以通过单个 awk 调用来做到这一点:

    awk -v me=$(whoami) -F: '$1==me{print NR}' /etc/passwd
    

    更详细的:

    • -v 创建一个名为meawk 变量并用您的用户名填充它。
    • -F 将字段分隔符设置为 :,以适合密码文件。
    • $1==me 仅选择第一个字段与您的用户名匹配的行。
    • print 输出记录号(行)。

    【讨论】:

    • 感谢您的精彩解释,但目前看来,我自己构建这样的命令似乎很先进:)
    • @Mario:你越早开始学习,你就能越早为你的开发服务收取高昂的费用:-)
    【解决方案2】:

    bash 手册页中检查命令替换。

    你可以在 ``$() 后面打勾,我个人更喜欢后者。

    所以对于你的问题:

    grep -n -e $(whoami) /etc/passwd | cut -f1 -d :
    

    whoami 的输出替换为grep 命令的-e 标志的参数,整个命令的输出将是运行用户的/etc/passwd 中的行号。

    【讨论】:

    • +1 因为它有效,但 Lynn 的答案更易于阅读(至少对于像我这样的初学者来说:))但我喜欢你指出我应该使用 grep 的 -n 开关让它更短。
    • +1,我也更喜欢 $() 构造,因为它更容易嵌套。
    【解决方案3】:
    cat /etc/passwd -n | grep `whoami` | cut -f1 
    

    用 ` 标记包围命令使其执行命令并将输出发送到包含它的命令中。

    【讨论】:

    • 如果没有锚定,如果您的登录名与该行的其他地方匹配,这可能会产生错误匹配。我曾经在本地系统上有一个简短的登录名,恰好匹配“系统操作员”(的子字符串)所以一些愚蠢的软件认为我是root,而我不是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    相关资源
    最近更新 更多