提问人:sirducas 提问时间:6/13/2022 最后编辑:RavinderSingh13sirducas 更新时间:6/24/2022 访问量:1243
如何使用 AWK 查找和匹配列中的精确字符串?
How to find and match an exact string in a column using AWK?
问:
我在匹配我想使用 .awk
我有一个名为“sup_groups.txt”的文件,其中包含:
(结构为:“group_name:pw:group_id:user1<,user2>...”)
adm:x:4:syslog,adm1
admins:x:1006:adm2,adm12,manuel
ssl-cert:x:122:postgres
ala2:x:1009:aceto,salvemini
conda:x:1011:giovannelli,galise,aceto,caputo,haymele,salvemini,scala,adm2,adm12
adm1Group:x:1022:adm2,adm1,adm3
docker:x:998:manuel
现在,我想提取用户列表中有用户“adm1”的记录并打印第一列(组名),但是您可以看到有一个名为“adm12”的用户,因此当我这样做时:
awk -F: '$4 ~ "adm1" {print $1}' sup_groups.txt
输出为:
adm
admins
conda
adm1Group
该命令当然也会打印那些包含字符串“adm12”的记录,但我不想要这些行,因为我只对用户“adm1”感兴趣。
那么,如何更改此命令,使其仅打印第 1 行和第 6 行(不包括第 2 行和第 5 行)?
非常感谢你,对不起我的英语不好
编辑:感谢您的回答,您给了我解决方案的灵感,我认为这可能与您的解决方案一样有效,但更简单:
awk -F: '$4 ~ "adm,|adm1$|:adm1," {print $1}' sup_groups.txt
基本上,我使用的是涵盖所有情况的 OR,不包括“adm12” 如果您认为这是正确的,请告诉我
答:
第一个解决方案:使用 的函数。使用您显示的示例,请尝试以下代码。split
awk
awk
awk -F':' '
{
num=split($4,arr,",")
for(i=1;i<=num;i++){
if(arr[i]=="adm1"){
print
}
}
}
' Input_file
解释:为上述内容添加详细说明。
awk -F':' ' ##Starting awk program from here setting field separator as : here.
{
num=split($4,arr,",") ##Using split to split 4th field into array arr with delimiter of ,
for(i=1;i<=num;i++){ ##Running for loop till value of num(total elements of array arr).
if(arr[i]=="adm1"){ ##Checking condition if arr[i] value is equal to adm1 then do following.
print ##printing current line here.
}
}
}
' Input_file ##Mentioning Input_file name here.
第二种解决方案:在 中使用正则表达式和条件。awk
awk -F':' '$4~/^adm1,/ || $4~/,adm1,/ || $4~/,adm1$/' Input_file
或者,如果第 4 个字段根本没有逗号,请尝试以下操作:
awk -F':' '$4~/^adm1,/ || $4~/,adm1,/ || $4~/,adm1$/ || $4=="adm1"' Input_file
解释:将字段分隔符设置为并检查条件,如果第 4 个字段等于 (从 adm1 开始),或者 IT 等于 OR 等于 (以 ,adm1 结尾),则打印该行。:
^adm1,
,adm1,
,adm1$
评论
split
这应该可以解决问题:
$ awk -F: '"," $4 "," ~ ",adm1," { print $1 }' file
这背后的想法是将两个组字段都封装在逗号之间,以便每个组条目都由逗号封装。因此,与其搜索,不如搜索adm1
,adm1,
因此,如果您的列表如下所示:
adm2,adm12,manuel
而且,通过添加逗号,您也可以转换它:
,adm2,adm12,manuel,
您始终可以搜索并找到完美匹配。,adm1,
评论
badm1
一旦 u 设置了每个任务要求,那么主体就变得勉强只是:FS
NF = !_ < NF
或者更直接:
{m,n,g}awk —- --NF
=
{m,g}awk 'NF=!_<NF' OFS= FS=':[^:]*:[^:]*:[^:]*[^[:alpha:]]?adm[0-9]+.*$'
adm
admins
conda
adm1Group
评论
:
,
adm:x:4:syslog,adm1
,
admins:x:1006:adm2,adm12,manuel
adm1