我是编程新手并决定学习bash,因为我们处理一些基于Linux/Unix的日志服务器,因此脚本编写更容易一些.
我有一个cvs文件,其布局如下:
PC,用户,文件,路径 - 所有逗号分隔.
我有一个行分隔的文件名白名单.有些包括空间.
我的目标是将白名单与csv文件的第3列进行比较,并输出所有不匹配的行.我尝试了一个带有if语句的while循环,但似乎无法让它工作.我做了一些awk一个衬垫,实际上从过去的stackoverflow帖子中得到一个输出与白名单相匹配的行,但我似乎无法弄清楚如何反转逻辑以使其工作.代码如下.
awk 'BEGIN{i=0}
FNR==NR { a[i++]=$1; next }
{ for(j=0; j<i; j++)
if(index($0,a[j]))
{print $0;break}
}' $whitelist $exestartup
Run Code Online (Sandbox Code Playgroud)
我想坚持使用没有附加组件的基本bash,而不是反对做一个循环/ if语句而不是一个awk单行.
样本输入/输出:
whitelist.txt
program.exe
super program.exe
possible-program.exe
exestartup.csv
Asset1,user1,potato.exe,c:\ users\user1
Asset2,user2,program.exe,c:\ users\user2
Asset3,user3,possible-program.exe,c:\ users\user3
Asset4,user4,super program .exe文件C:\用户\ USER4
产量
Asset1,用户1,potato.exe,C:\用户\ USER1
awk 救援!
awk -F, 'FNR==NR{a[$1]; next} !($3 in a)' whitelist exestartup
Run Code Online (Sandbox Code Playgroud)
将字段分隔符设置为逗号.加载所有白名单名称,并与文件的$ 3字段进行比较,如果不匹配; 打印.
如果您发布样本输入和预期输出,您将获得更多答案,也许更好的建议.
使用您的输入文件
$ awk -F, 'FNR==NR{a[$1]; next} !($3 in a)' whitelist.txt exestartup.csv
Asset1,user1,potato.exe,c:\users\user1
Run Code Online (Sandbox Code Playgroud)
如果你awk的身体被破坏而且场地值不相交,你可以恢复原状grep
$ grep -vf whitelist.txt exestartup.csv
Asset1,user1,potato.exe,c:\users\user1
Run Code Online (Sandbox Code Playgroud)