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 个不同字符串 colsvals 中的相应搜索值传递给 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