下面是一个文件,如果用户名中的数字是奇数,并且名字中的第一个字符是元音,我必须使用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'
从用户名获取数字,但如果数字为奇数,我不知道如何打印用户名。
有人可以帮助我吗?
答案 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
使正则表达式不区分大小写。