搜索字符串并从文件中返回特定列

搜索字符串并从文件中返回特定列

我有一个名为 test_wd 的文件,其中包含

dkde456:[email protected]
dkde123:[email protected]  
dkde789:[email protected]

第一列是用户 ID,第二列是完整的电子邮件地址。假设我是dkde123。我运行一个脚本,但结果只能发送到我的电子邮件地址。

我写过这个:

LMUSER="`whoami`"
# So now I check whether my user-name is in the file:
if grep  "${LMUSER}" test_wd
then echo "found"
# ??????? How to create a file and send this file to my email address
else
    echo "not found"
    exit 0
fi 

现在我只想选择 column2,以便我可以运行脚本来创建文件并将该文件发送到我的电子邮件地址。如果if 条件语句在上面的代码中返回 true 代替问号?

答案1

有很多方法可以做到这一点。这是一个grep+cut变体...

# surround LMUSER with ^ and : to make sure we match whole usernames only
email=$(grep "^${LMUSER}:" test_wd | cut -d: -f2)

# $email will be empty unless there was a match
if [[ -n $email ]]; then
    # send the message to "$email"
fi

或者也许你喜欢sed

email=$(sed -n "s/^${LMUSER}:\(.*\)/\1/p" test_wd)

-n跳过所有行的打印,除了明确指定用于打印的行(例如p此处带有替换标志的行)。它说“如果发生替换则打印此行”。

为了仅提取电子邮件地址,我们将该部分括起来\(......\)然后在替换中我们可以用 a 取出这些括号内的文本反向引用: \1

答案2

您可以使用 awk 提取电子邮件地址,因此:

email=$(awk -F: -v usa=$(whoami) '$1 == usa { print $2 }' test_wd)

使用 -F将字段分隔符设置为:并将用户名作为变量传递usa。如果第一条:分隔数据等于用户名,则打印第二条数据,即电子邮件地址。

答案3

要发送主题为“test”的消息“Hello user”,请尝试(假设mutt已安装并正常工作):

awk -F: '$1==user {print "Helo "$1 | "mutt -s 'test' " $2}' user=$USER test_wd

相关内容