【问题标题】:BASH grep scriptBASH grep 脚本
【发布时间】:2023-03-30 09:10:01
【问题描述】:

我正在尝试使用 bash 脚本检查脚本参数中的用户名,然后从 /etc/passwd 和 /etc/group 文件(而不是 /etc/shadow 文件)输出相关行.目前,我正在使用 if then else 循环来检查 /etc/* 目录的内容并输出相关信息。如果在两个文件中找不到匹配用户,我的意图是输出简单的文本行,因此为空值。但是,它输出的信息对于我正在寻找的内容完全不正确。作为 BASH 的新用户,并且 linux 是通用的,我确信马上就会出现一些明显的问题。不过,我正在努力学习。

对我的脚本代码或正确方向的任何帮助将不胜感激。谢谢。

#! /bin/bash                                                              


USERLOOK='grep -h $USERID ~/etc/* | grep :x:'                       

grep $1 ~/etc/*                                                     
if [ -z $1 ]; then                                                        
    echo "User not found."                                            
else                                                                      
    echo "$USERLOOK"                                                  
fi                                                                        
exit 0

【问题讨论】:

  • 问题不清楚?您希望输入用户名作为脚本的参数,例如 ./script user_to_check?
  • 你应该阅读quotingcommand substitution
  • @sjsam 是的,我想在我输入 ./script user_to_check 的地方使用脚本功能。如果找到用户名,我想输出找到它的所有行,这就是我使用 grep 的原因。但是,如果找不到用户名,我想回应一下。
  • @Cyrus 感谢您的链接。我已经用这个脚本的各种迭代尝试了几次拼写检查。虽然有些返回没有错误,但输出从来都不是我想要的。不过感谢您的建议。

标签: linux bash shell loops grep


【解决方案1】:

/etc/passwd/etc/group 中查找包含输入用户名的任何行:

#!/bin/bash

USERLOOK=$(grep -h "$1" /etc/passwd /etc/group)

if [ -z "$1" ] || [ -z "${USERLOOK}" ]; then
    echo "User not found."
else
    echo "$USERLOOK"
fi

【讨论】:

  • :x: 不适用于/etc/shadow,无论如何您应该将搜索锚定到行首,例如"^$1:"
  • 您可能希望将旧的反引号替换为 $()
  • 感谢您的回复。这绝对比我最初拥有的效果更好,但是,我试图从两个文件中返回包含脚本参数中输入的用户名的所有行。另外,我确实看到了一些基于这个脚本的语法错误,所以也谢谢你。
  • 另外,我认为 IF 语句的第一行只是在寻找一个空白参数是否正确,或者如果在两个文件中的任何一个中都找不到用户名,那么该功能是否相同?
  • 好的,我在您的问题中看到了:x:,并认为您只在寻找那些行,我已更新脚本以包含所有行并检查空输入。
【解决方案2】:

我想在我输入 ./script 的地方拥有脚本功能 user_to_check。如果找到用户名,我想输出所有行 在哪里找到它......但是,如果找不到用户名,我想要 回应这一点。

可以这么简单

#!/bin/bash
grep "^${1}:" /etc/passwd   /etc/group
[ $? -ne 0 ] && echo "User : ${1} not found"

由于用户名出现在 /etc/passwd/etc/group 的开头,我们在 grep 中放置了一个 ^ 以匹配开头的内容,并且按照传统,: 出现在用户名之后。

运行脚本

./script 'username'

【讨论】:

  • 使用"^$1:" 否则你可以在调用./script foo 时获得用户foobar
  • 感谢您的回复。这确实返回第一个用户名值。但是,我试图返回包含输入用户名的所有行,因此我最初使用 grep 的理由。
  • @mona_sax 再次感谢您的帮助。我刚刚使用我知道文件中存在的用户名输入了该脚本,但它仍然返回未找到。在另一个回复中,我进一步澄清了我试图用这个脚本做的事情:“我希望在我输入 ./script user_to_check 的地方有脚本函数。如果找到用户名,我想输出它所在的所有行找到了,这就是我使用 grep 的原因。但是,如果找不到用户名,我想回应一下。”
  • @NewBashUser226 :请查看更新。如果这有帮助,请给我更新?
  • @mona_sax 感谢您的帮助。你的脚本实际上帮助我研究了更多的主题,我也会研究你的方法和我的方法。但是,我相信 jchavannes 发布的脚本回答了我的问题,并使用了更接近我的新用户技能水平的代码。
【解决方案3】:

停下,你想这一切都错了。

UNIX shell 是一个环境,可以从中调用 UNIX 工具,并使用一种语言对这些调用进行排序,仅此而已。用于操作文本的通用 UNIX 工具是 awk。因此,如果您需要在文件中查找文本并使用控制逻辑对其执行任何操作,那应该是 awk 脚本,而不是 shell 脚本。 Shells的作用就是调用awk,类似这样:

awk -v user="$1" '
$0 ~ user { line = $0 }
END { print (line != "" ? line : "User not found") }
' /etc/passwd /etc/group

但请注意,使用 awk 将搜索集中在一个字段上是微不足道的,甚至是每个文件的不同字段,这与使用 grep 的难度不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多