如何打印匹配作为参数给出的所有名称?

时间:2020-05-30 15:25:13

标签: bash shell

我想写一个脚本作为任何名称作为参数,并打印路径列表 到具有该名称的人的主目录。 我是脚本新手。有没有简单的方法可以使用awkegrep命令执行此操作?

示例:

$显示名称jakub anna(作为参数)

/home/users/jakubo
/home/students/j_luczka
/home/students/kubeusz
/home/students/jakub5z
/home/students/qwertinx
/home/users/lazinska
/home/students/annalaz

这是我朋友的代码,但我必须以不同的方式编写它,并且必须像此代码一样简单

#!/bin/bash

for name in $@
do  
        awk -v n="$name" -F ':' 'BEGIN{IGNORECASE=1};$5~n{print $6}' /etc/passwd  | while read line
        do
                echo $line
        done
done

2 个答案:

答案 0 :(得分:0)

可以使用简单的awk脚本查找匹配的名称。

名称列表可以作为空格分隔的列表传递给awk,它将构成(在BEGIN部分中)组合模式(例如'(names | jakub | anna)')。该模式用于测试密码文件的用户名列($ 5)。

#! /bin/sh
awk -v "L=$*" -F: '
BEGIN {
    name_pat = "(" gensub(" ", "|", "g", L) ")"
}
$5 ~ name_pat { print $6 } 
' /etc/passwd

答案 1 :(得分:-1)

由于目前总体上这个问题尚不清楚,所以这只是一段较长的评论,而只是部分答案。

有一个简单的简化,因为示例代码包括:

 ... | while read line
       do
             echo $line
       done

上面|之后和包括echo $line所示的所有代码都是不必要的,并且什么也不做(例如UUoC),因此应将其删除。 (实际上,$line带有未引号的class A { ... protected: static std::mutex someMutex; } 会删除格式和重复的空格,但这与手头的任务无关,因此我们可以说上面的代码什么都不做。)