解析bash中的一行

时间:2008-12-05 23:36:19

标签: bash parsing

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

 "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 个答案:

答案 0 :(得分:8)

您可以使用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

答案 1 :(得分:1)

这是完全在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