gpt4 book ai didi

linux - 如何使用 bash 从文件中提取特定行

转载 作者:太空宇宙 更新时间:2023-11-04 12:26:16 24 4
gpt4 key购买 nike

我正在编写一个脚本,该脚本应从命令结果中提取特定类型的用户及其相应的 uidNumber 并将其输出到文件中。示例命令结果为:

dn: uid=test_user_2,ou=People,fsFragmentId=Security,fsClusterId=ClusterRoot
cn: test_user_2
uid: test_user_2
uidNumber: 10000
gidNumber: 400
homeDirectory: /home/test_user_2
userPassword:: e2NyeXB0fSo=

dn: uid=test_user_3,ou=People,fsFragmentId=Security,fsClusterId=ClusterRoot
cn: test_user_3
uid: test_user_3
uidNumber: 500
gidNumber: 400
homeDirectory: /home/test_user_2
userPassword:: e2NyeXB0fSo=

dn: cn=test_group_3,ou=Group,fsFragmentId=Security,fsClusterId=ClusterRoot
cn: test_group_3
gidNumber: 10000
homeDirectory: /home/test_user_3
userPassword:: e2NyeXB0fSo=

我想打印所有 "ou=People,fsFragmentId=Security,fsClusterId=ClusterRoot"uidNumber 为 10000 到 60000 的用户

我已经用 "ou=People,fsFragmentId=Security,fsClusterId=ClusterRoot" 提取了行,但是,我不知道如何提取其对应的 uidNumber/p>

我使用了下面的命令:

$LDAP_command | grep "dn: uid=.*,ou=People,fsFragmentId=Security,fsClusterId=ClusterRoot" > ldapsearch_extracted.txt

预期的输出应该是这样的:

dn: uid=test_user_2,ou=People,fsFragmentId=Security,fsClusterId=ClusterRoot
uidNumber: 10000

最佳答案

sed -n '/^\(dn\|uidNumber\):/H;/^$/ba;$ba;bb;:a;x;/uidNumber: [1-5][0-9]\{4\}\b/p;:b' <file.txt 

dn: uid=test_user_2,ou=People,fsFragmentId=Security,fsClusterId=ClusterRoot
uidNumber: 10000

sed -n '/^\(dn:.*ou=People,fsFragmentId=Security,fsClusterId=ClusterRoot\|uidNumber:\)/H;/^$/ba;$ba;bb;:a;x;/uidNumber: [1-5][0-9]\{4\}/p;:b' <file.txt

解释:

可以写成:

sed -n '
/^\(dn\|uidNumber\):/H;
/^$/ba;
$ba;
bb;
:a;
x;
/uidNumber: [1-5][0-9]\{4\}\b/p;
:b
' <file.txt
  • 搜索 ^dn:^uidNumber,然后添加到保留空间
  • 在空行 ^$ 分支到标签 :a
  • 在最后一行分支到标签 :a
  • 分支到标签 :b
  • 标签:a
    • 将当前模式空间(空行)与保持空间交换
    • 如果 uidNumber:[1-5][0-9]\{4\}(包括从 1000059999),然后打印
  • label :b(循环到下一行)

或者

sed -n '
/^dn:.*ou=People,fsFragmentId=Security,fsClusterId=ClusterRoot/H;
/^uidNumber:/H;
/^$/ba;
$ba;
bb;
:a;
x;
/uidNumber: [1-5][0-9]\{4\}\b/p;
:b
' <file.txt

有明确的条件:

sed -n '
/^\(dn\|uidNumber\|gidNumber\):/H;
/^$/ba;
$ba;
bb;
:a;
x;
/uidNumber: [1-5][0-9]\{4\}\b/{
/ou=People/{
/fsFragmentId=Security/{
/fsClusterId=ClusterRoot/{
p;
}
}
}
};
:b
' <file.txt

这将

  • 在保留空间中存储 dn、uidNumber 和 gidNumber,
  • 在最后一行或空行,如果 uidNumber:[1-5][0-9]{4}(包括从 10000 到 59999),则
    • 如果ou=People,那么
      • 如果 fsFragmentId=Security,则
        • 如果 fsClusterId=ClusterRoot,则打印。

这样做的主要优点是确保它与 dn 行上的另一个变量顺序一起工作。

关于linux - 如何使用 bash 从文件中提取特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44514252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com