我正在尝试将包含典型访问控制矩阵表的CSV文件解析为shell脚本。我的示例CSV文件是
"user","admin","security"
"user1","x",""
"user2","","x"
"user3","x","x"
我将使用此列表在各自的文件夹中创建文件。问题是如何让它存储第2/3列(admin / security)的值?我想要实现的输出是对具有管理员/安全权限的所有用户进行分组/排序,并在各自的文件夹中创建文件。 (我的想法是将所有管理员/安全用户存储在不同的文件中并从那里运行。)
环境不允许我使用任何Perl或Python程序。但是,非常感谢任何awk
或sed
命令。
我想要的输出是
$ cat sample.csv
“用户”,“管理员”,“安全”
“用户1”, “X”, “”
“用户2”, “”, “X”
“用户3”, “X”, “X”
$ cat security.csv
用户2
用户3
$ cat admin.csv
USER1
用户3
答案 0 :(得分:5)
如果你可以使用cut(1)
(如果你使用的是任何类型的unix,你可以使用它),你可以使用
cut -d , -f (n) (file)
其中n
是您想要的列。
您可以使用一系列列(2-3
)或列列表(1,3
)。
这将留下引号,但你可以使用sed命令或轻量级的东西。
$ cat sample.csv
"user","admin","security"
"user1","x",""
"user2","","x"
"user3","x","x"
$ cut -d , -f 2 sample.csv
"admin"
"x"
""
"x"
$ cut -d , -f 3 sample.csv
"security"
""
"x"
"x"
$ cut -d , -f 2-3 sample.csv
"admin","security"
"x",""
"","x"
"x","x"
$ cut -d , -f 1,3 sample.csv
"user","security"
"user1",""
"user2","x"
"user3","x"
请注意,这不适用于一般的csv文件(不处理转义的逗号),但它应该适用于类似于简单用户名和x的示例格式的文件。
如果您只想获取用户名列表,那么awk
几乎就是为这项工作制作的工具,下面的答案可以很好地完成,我不需要重复。
但是grep解决方案可能更快,更轻量化
grep
解决方案:
grep '^\([^,]\+,\)\{N\}"x"'
其中N
是第N列,用户为第0列。
$ grep '^\([^,]\+,\)\{1\}"x"' sample.csv
"user1","x",""
"user3","x","x"
$ grep '^\([^,]\+,\)\{2\}"x"' sample.csv
"user2","","x"
"user3","x","x"
从那里开始,您可以使用cut
获取第一列:
$ grep '^\([^,]\+,\)\{1\}"x"' sample.csv | cut -d , -f 1
"user1"
"user3"
和sed 's/"//g'
删除引号:
$ grep '^\([^,]\+,\)\{1\}"x"' sample.csv | cut -d , -f 1 | sed 's/"//g'
user1
user3
$ grep '^\([^,]\+,\)\{2\}"x"' sample.csv | cut -d , -f 1 | sed 's/"//g'
user2
user3
答案 1 :(得分:1)
有些东西可以帮助您入门(请注意,这对于带有嵌入式逗号的csv文件不起作用,您必须使用csv解析器):
awk -F, '
NR>1 {
gsub(/["]/,"",$0);
if($2!="" && $3!="")
print $1 " has both privileges";
print $1 > "file"
}' csv