UNIX: 切入 if
UNIX: cut inside if
我有一个简单的搜索脚本,它会根据用户的选项在文件的特定列中进行搜索。
该文件看起来类似于 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"
将在第一列中搜索 "searchedword",在第二列中搜索 "secondword"
该函数如下所示:
while [ $# -gt 0 ]; do
case "" in
-1|--one)
c=1
;;
-2|--two)
c=2
;;
-3|--three)
c=3
;;
...
esac
在c变量中是我要搜索的列的编号。
cat data | if [ "$( cut -f $c -d ':' )" == "" ]; then cut -d: -f 1-7 >> result; fi
现在我有这样的事情,我尝试 select 右列并将其与第二个选项(在本例中为 "searchedword" 进行比较,然后将整个列复制到结果 文件。但它不起作用。它不会将任何内容复制到结果文件中。
有谁知道问题出在哪里?
感谢回答
(在我使用的脚本末尾:
shift
shift
得到接下来的两个选项)
我建议使用 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
我有一个简单的搜索脚本,它会根据用户的选项在文件的特定列中进行搜索。
该文件看起来类似于 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"
将在第一列中搜索 "searchedword",在第二列中搜索 "secondword" 该函数如下所示:
while [ $# -gt 0 ]; do
case "" in
-1|--one)
c=1
;;
-2|--two)
c=2
;;
-3|--three)
c=3
;;
...
esac
在c变量中是我要搜索的列的编号。
cat data | if [ "$( cut -f $c -d ':' )" == "" ]; then cut -d: -f 1-7 >> result; fi
现在我有这样的事情,我尝试 select 右列并将其与第二个选项(在本例中为 "searchedword" 进行比较,然后将整个列复制到结果 文件。但它不起作用。它不会将任何内容复制到结果文件中。
有谁知道问题出在哪里? 感谢回答
(在我使用的脚本末尾:
shift
shift
得到接下来的两个选项)
我建议使用 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