代码之家  ›  专栏  ›  技术社区  ›  Alan Featherston

在bash中解析一行

  •  2
  • Alan Featherston  · 技术社区  · 16 年前

    我有一个文件,每行有一个条目。每行的格式如下:

     "group:permissions:users" 
    

     "grp1:create,delete:yo,el,ella" 
    

    我想返回以下内容:

    yo
    el
    ella
    

    这就是我到目前为止所做的:

    cat file | grep grp1 -w | cut -f3 -d: | cut -d "," -f 2
    

    yo,el.ella ,如何使其每行返回一个值?

    2 回复  |  直到 12 年前
        1
  •  10
  •   Jay    16 年前

    您可以使用awk,使用-F选项将:用作字段分隔符:

    [user@host]$ echo "grp1:create,delete:yo,el,ella" | awk -F ':' '{print $3}'
    yo,el,ella
    

    这将得到用户字符串,用逗号分隔。然后你可以用那根绳子做任何你想做的事。如果要逐行打印每个用户,可以使用tr将逗号替换为换行符:

    [user@host]$ echo "grp1:create,delete:yo,el,ella" | awk -F ':' '{print $3}' | tr ',' '\n'
    yo
    el
    ella
    
        2
  •  2
  •   user43983    16 年前

    这里有一种完全在shell脚本中完成的方法。您只需更改IFS,就可以让它在正确的字符上打断“单词”。注意:这根本不会处理转义(例如某些文件格式中的“:”)。

    这是为了允许您执行以下操作:

    cat file | name-of-script
    

    #!/bin/bash
    while IFS=: read group permissions users; do
      if [ "$group" = "grp1" ]; then
        IFS=,
        set -- $users
        while [ $# -ne 0 ]; do
          echo $1
          shift
        done
      fi
    done