UNIX:切入内部如果

时间:2016-05-01 14:26:21

标签: bash unix if-statement cut

我有一个简单的搜索脚本,根据用户的选项,它将搜索文件的某一列。

该文件类似于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

获取接下来的两个选项)

1 个答案:

答案 0 :(得分:3)

我建议使用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