AWK和Grep说明

时间:2016-03-17 17:09:23

标签: awk grep

下面是一个文件,如果用户名中的数字是奇数,并且名字中的第一个字符是元音,我必须使用awk或grep进行搜索。

aaie1001:x:1:600:Alex:/home/scs/gr911/aaie1001:/bin/bash abie1032:x:2:600:Mihai:/home/scs/gr911/abie1032:/bin/bash acie1203:x:3:600:Andra:/home/scs/gr911/acie1203:/bin/bash

acie1203,abie1032,aaie1001是用户名,Alex,Mihai,Andra是名字。

我试着这样做: awk -F'[^0-9]*' '$0=$2'从用户名获取数字,但如果数字为奇数,我不知道如何打印用户名。

有人可以帮助我吗?

4 个答案:

答案 0 :(得分:1)

getContext().getSystemService()

使用$ cat f aaie1001:x:1:600:Alex:/home/scs/gr911/aaie1001:/bin/bash abie1032:x:2:600:Mihai:/home/scs/gr911/abie1032:/bin/bash acie1203:x:3:600:Andra:/home/scs/gr911/acie1203:/bin/bash acie1208:x:3:600:Andra:/home/scs/gr911/acie1203:/bin/bash $ grep -P '^[a-z]+[0-9]*[02468]:(?:[^:]*):(?:[^:]*):(?:[^:]*):[AEIOUaeiou].*$' f acie1208:x:3:600:Andra:/home/scs/gr911/acie1203:/bin/bash $ 语法来查找所需的记录,perl是非捕获组,(?:regex)确保字段1中的数字是偶数,[02468]表示后面的元音:[AEIOUaeiou]即名称字段中的第一个字符

另一个较短的版本可以像这样分组不必要的字段:

:

答案 1 :(得分:1)

awk救援! 同样的想法,但可以更紧凑地写成

$ awk '/^[aouei][^:]*[13579]:/' file

aaie1001:x:1:600:Alex:/home/scs/gr911/aaie1001:/bin/bash
acie1203:x:3:600:Andra:/home/scs/gr911/acie1203:/bin/bash

如果你想要否定这一点(我要求你不清楚),只需否定模式

$ awk '!/^[aouei][^:]*[13579]:/' file

abie1032:x:2:600:Mihai:/home/scs/gr911/abie1032:/bin/bash

如果您希望对名称进行限制而不是用户名,则更容易拆分字段

$ awk -F: '$1 ~ /[13579]$/ && tolower($5)~/^[aeoui]/' file

aaie1001:x:1:600:Alex:/home/scs/gr911/aaie1001:/bin/bash
acie1203:x:3:600:Andra:/home/scs/gr911/acie1203:/bin/bash

再次,否定。

$ awk -F: '!($1 ~ /[13579]$/ && tolower($5)~/^[aeoui]/)' file

abie1032:x:2:600:Mihai:/home/scs/gr911/abie1032:/bin/bash

答案 2 :(得分:0)

我选择这样的事情:

awk -F: 'substr($1, length($1)) % 2 && substr($5, 1, 1) ~ /[AEIOU]/' file

它将每一行拆分为每个:上的字段,并打印第一个字段的最后一个字符为奇数的行(我们假设它始终是一个数字),第五个字段的第一个字符是大写的元音。

答案 3 :(得分:0)

我会使用以下awk命令,因为它允许您以非常干净的方式表达问题:

awk -F: '$1 ~ /[13579]$/ && $5 ~ /^[aeiou]/i' file

使用:作为分隔符,可以在字段1中访问用户名,在字段5中访问名称。

正则表达式检查名称是否以元音^[aeiou]开头,用户名以奇数位[13579]$结尾。选项i使正则表达式不区分大小写。