【问题标题】:AWK command helpAWK 命令帮助
【发布时间】:2010-01-27 07:45:01
【问题描述】:

如何编写一个 awk 命令来读取 /etc/passwd 文件,并仅打印出任何将 /bin/bash 程序作为其默认命令 shell 的用户的名称?

【问题讨论】:

    标签: awk


    【解决方案1】:
    cat /etc/passwd | awk -F ":" '$7=="/bin/bash" { print $1 }'
    

    【讨论】:

    • +1 但猫没用! :-) awk -F: '$7 == "/bin/bash" { print $1 }' /etc/passwd
    【解决方案2】:

    由于这是家庭作业,我不会为您编写程序(希望其他人也不会这样做),但您需要了解以下内容:

    • AWK 中的默认字段分隔符是空格; /etc/passwd 中的字段分隔符是冒号。您可以通过FS 变量或命令行中的-F 更改AWK 中的字段分隔符。

    • /etc/passwd/ 中,shell 列在第 7 个字段中。

    好吧,在我写这么多的时间里,有两个人为你完成了你的功课。祝你好运!

    【讨论】:

      【解决方案3】:

      awk -F: '/\/bin\/bash$/{print $1}' /etc/passwd

      【讨论】:

      • 那么 /bin/bash 和 /tmp/attack/bin/bash 一样吗?
      • 好收获。像贝尔一样检查整个字段是一种更好的方法。
      • 既然你已经将分隔符设置为 ":" ,为什么要检查整行的 bash 呢?使用 $7
      • @ghostdog74:这正是我在回复 Roger 时所指的。我没有编辑我的答案,以便与 cmets 保持一致。
      【解决方案4】:

      @OP,你可以使用 awk

      awk 'BEGIN{FS=":"}$7~/bash/{print $1}' /etc/passwd
      

      上述检查 bash,但不限于 /bin/bash。如果您确实需要 /bin/bash,请更改它。

      或者告诉你的老师你只想使用 shell

      #!/bin/bash
      
      while IFS=":" read -r user b c d e f sh h
      do
          case "$sh" in
              *bash* ) echo $user;;
          esac
      done <"/etc/passwd"
      

      【讨论】:

        猜你喜欢
        • 2015-11-04
        • 2015-04-12
        • 1970-01-01
        • 2018-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多