我确信必须有一个简单的答案,但我无法解决这个问题,我在这里发现的类似问题并不能让我跨越这条线路(尽管他们帮助过了)。
我在Windows中有一个TestFile.txt文本文件,每行有不同数量的OU,如下所示:
"CN=John Doe,OU=Milk,OU=Dairy,OU=Food,DC=company,DC=com"
"CN=Jane Doe,OU=Red,OU=Apples,OU=Fruit,OU=Food,DC=company,DC=com"
"CN=Pete Doe,OU=Forks,OU=Cutlery,OU=NotFood,DC=company,DC=com"
"CN=Fred Doe,OU=Spoons,OU=Cutlery,OU=NotFood,DC=company,DC=com"
"CN=Alex Doe,OU=Biscuits,OU=Chocolate,OU=Candy,OU=Food,DC=company,DC=com"
"CN=Peta Doe,OU=Buttons,OU=Chocolate,OU=Candy,OU=Food,DC=company,DC=com"
我想删除无关数据,以便我只留下最后两个这样的OU:
OU=Dairy,OU=Food
OU=Fruit,OU=Food
OU=Cutlery,OU=NotFood
OU=Cutlery,OU=NotFood
OU=Candy,OU=Food
OU=Candy,OU=Food
我已经使用sed的Windows端口轻松地删除了每行的开头和结尾:
sed -e "s/[^,]*,//" -e "s/,DC\=.*//" TestFile.txt
......这给了我:
OU=Milk,OU=Dairy,OU=Food
OU=Red,OU=Apples,OU=Fruit,OU=Food
OU=Forks,OU=Cutlery,OU=NotFood
OU=Spoons,OU=Cutlery,OU=NotFood
OU=Biscuits,OU=Chocolate,OU=Candy,OU=Food
OU=Buttons,OU=Chocolate,OU=Candy,OU=Food
所以现在我只需要在每一行上隔离最后两个OU并忽略其他所有内容。如果每行都有固定数量的OU,这会简化很多事情,但是如何制作一个sed表达式以容纳不同数量的OU?
答案 0 :(得分:2)
使用GNU sed:
sed -r 's/.*(OU=[^,]*,OU=[^,]*),DC=.*/\1/' file
输出:
OU=Dairy,OU=Food OU=Fruit,OU=Food OU=Cutlery,OU=NotFood OU=Cutlery,OU=NotFood OU=Candy,OU=Food OU=Candy,OU=Food
答案 1 :(得分:1)
好的,多亏了josifoski,我知道了:
cat TestFile.txt | sed -e "s/[^,]*,//" -e "s/,DC\=.*//" | gawk -F, "{ print $(NF-1), $NF; }"
完美,谢谢。 =)
答案 2 :(得分:0)
假设在每行的最终OU之后总是只有两个字段。这可能是AWK中的解决方案。只是AWK。
awk -F, '{OU=$(NF-3)","$(NF-2); print OU}' file > outfile
哪个输出:
OU=Dairy,OU=Food
OU=Fruit,OU=Food
OU=Cutlery,OU=NotFood
OU=Cutlery,OU=NotFood
OU=Candy,OU=Food
OU=Candy,OU=Food