我有一个简单的搜索脚本,根据用户的选项,它将搜索文件的某一列。
该文件类似于passwd
openvpn:x:990:986:OpenVPN:/etc/openvpn:/sbin/nologin
chrony:x:989:984::/var/lib/chrony:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
现在基于用户选项的功能将搜索文件的不同列。例如
-1 "searchedword" -2 "secondword"
将在第一列搜索“搜索字词”,在第二列搜索“第二字” 该函数如下所示:
while [ $# -gt 0 ]; do
case "$1" in
-1|--one)
c=1
;;
-2|--two)
c=2
;;
-3|--three)
c=3
;;
...
esac
在c变量中是我要搜索的列的编号。
cat data | if [ "$( cut -f $c -d ':' )" == "$2" ]; then cut -d: -f 1-7 >> result; fi
现在我有类似这样的内容,我尝试选择正确的列并将其与第二个选项进行比较,在本例中为“searchword”,然后将整列复制到结果文件。但它不起作用。它不会将任何内容复制到结果文件中。
有谁知道问题出在哪里? 谢谢你的回答
(在我使用的脚本末尾:
shift
shift
获取接下来的两个选项)
答案 0 :(得分:3)
我建议使用awk执行此任务,因为awk是处理分隔列和行的更好工具。
考虑这个awk命令,我们将搜索列号以2个不同的字符串cols
和vals
的相应搜索值传递给awk命令:
awk -v cols='1:3' -v vals='rpcuser:29' 'BEGIN {
FS=OFS=":" # set input/output field separator as :
nc = split(cols, c, /:/) # split column # by :
split(vals, v, /:/) # split values by :
}
{
p=1 # initialize p as 1
for(i=1; i<=nc; i++) # iterate the search cols/vals and set p=0
if ($c[i] !~ v[i]) { # if any match fails
p=0
break
} # finally value of p decides if a row is printing or not
} p' file
<强>输出:强>
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin