我有一个问题,无法弄清楚。它是索拉里斯。过于简化的源文件和参考文件。
s.txt源文件:
dn: cn=task,cn=Groups,dc=domain
changetype: modify
add: uniquemember
uniquemember: cn=user1,cn=users,dc=domain
dn: cn=task,cn=Groups,dc=domain
changetype: modify
add: uniquemember
uniquemember: cn=user9,cn=users,dc=domain
dn: cn=task,cn=Groups,dc=domain
changetype: modify
add: uniquemember
uniquemember: cn=user10,cn=users,dc=domain
r.txt参考文件:
uniquemember: cn=user9,cn=users,dc=domain
uniquemember: cn=user8,cn=users,dc=domain
我想要一个使用参考记录 uniquemember 文件来提取源文件的 cn=user9 行和上面 3 行的脚本,添加到结果文件 usermember_
添加.ldif:
dn: cn=task,cn=Groups,dc=domain
changetype: modify
add: uniquemember
uniquemember: cn=user9,cn=users,dc=domain
答案1
如果您尝试使用r.txt
as中的值键从 中提取匹配的多行记录s.txt
,然后尝试
awk 'NR==FNR {u[$2]++; next} $NF in u' r.txt RS= s.txt
r.txt
使用默认(换行)记录分隔符进行处理,u
使用第二个空格分隔字段中的键构造关联数组;然后- 取消设置记录分隔符
RS=
以切换到段落模式对于第二个文件 - 以段落模式处理
s.txt
,即将每个空行分隔的块视为单个记录,$NF
然后可以将其最后一个字段值用作查找值u
- 如果
$NF
存在于u
,则打印整个记录
要在匹配的记录之间添加空格:
如果您有 GNU awk ( gawk
),您可以使用特殊变量RT
来添加回原始段落分隔符:
gawk 'NR==FNR {u[$2]++; next} $NF in u {print $0 RT}' r.txt RS= s.txt
更一般地,您可以在每个匹配的记录之后附加一个额外的换行符:
awk 'NR==FNR {u[$2]++; next} $NF in u {print $0 "\n"}' r.txt RS= s.txt
或在默认值中添加额外的换行符输出字段分隔符:
awk 'NR==FNR {u[$2]++; next} $NF in u' r.txt RS= ORS='\n\n' s.txt
答案2
从您的问题中我了解到您想使用代码读取user
中的关键字r.txt
,然后在 中搜索该关键字s.txt
。最后,打印与该关键字相关的行(以及前三行)in s.txt
。您可以将这些行写入名为的文件中"code"
:
#!/bin/bash
if [[ `egrep user9 r.txt` ]] ; then
grep -B 3 user9 s.txt
fi
授予此文件"code"
权限,然后在终端中运行它,如下所示:
code > add.ldif
输出是:
dn: cn=task,cn=Groups,dc=domain
changetype: modify
add: uniquemember
uniquemember: cn=user9,cn=users,dc=domain
假设您有两个user9
in条目s.txt
,如下所示:
dn: cn=task,cn=Groups,dc=domain
changetype: modify
add: uniquemember
uniquemember: cn=user1,cn=users,dc=domain
dn: cn=task,cn=Groups,dc=domain
changetype: modify
add: uniquemember
uniquemember: cn=user9,cn=users,dc=domain
dn: cn=task,cn=Groups,dc=domain
changetype: modify
add: uniquemember
uniquemember: cn=user18,cn=users,dc=domain
dn: cn=XXX,cn=XXX,dc=XXX
changetype: XXX
add: XXX
uniquemember: cn=user9,cn=users,dc=domain
前面的代码将找到 user9 的两个条目:
dn: cn=task,cn=Groups,dc=domain
changetype: modify
add: uniquemember
uniquemember: cn=user9,cn=users,dc=domain
--
dn: cn=XXX,cn=XXX,dc=XXX
changetype: XXX
add: XXX
uniquemember: cn=user9,cn=users,dc=domain