gpt4 book ai didi

awk - grep,剪切并从文件中删除\n

转载 作者:行者123 更新时间:2023-12-04 01:07:09 26 4
gpt4 key购买 nike

我正在处理一个输入文件,该文件在新的一行中包含用户 ID 列表。在 bash 脚本中,我在该输入文件上运行 while 循环,使用 grep -E 执行 ldapsearch 查询以过滤我想要的结果。生成的输出文件目前格式如下(/mountpoint/out_file_1.out);

uid=user_id1,cn=Users,ou=Department,dc=myORG    
LDAPresource=myORG_RESname1 LDAPresource=myORG_RESname2
uid=user_id2,cn=Users,ou=Department,dc=myORG
LDAPresource=myORG_RESname2 LDAPresource=myORG_RESname3

然而,所需的输出应如下所示;

user_id1;myORG_RESname1
user_id1;myORG_RESname2
user_id2;myORG_RESname2
user_id2;myORG_RESname3

到目前为止,我已经尝试使用 grep 和 cut 来实现上述所需的输出。这是我在上面的第一个结果文件上运行的确切命令:

grep -E '(^uid=|myORG_RESname1|myORG_RESname2|myORG_RESname3)' /mountpoint/out_file_1.out | cut -d, -f1 >&5

这会产生第二个输出 (/mountpoint/out_file_2.out);

uid=user_id1  
LDAPresource=myORG_RESname1
LDAPresource=myORG_RESname2

再次,用 cut 运行另一个 grep:

grep -E 'LDAPresource|uid=' /mountpoint/out_file_2.out | cut -d= -f2 >&6

最终产生这个输出(/mountpoint/out_file_3.out):

user_id1  
myORG_RESname1
myORG_RESname2

这“几乎”是我所需要的。我生成的最后一个输出需要去掉换行符并为找到的每个资源名称重复用户 ID,如已针对所需输出 (/mountpoint/final_output.out) 所述:

user_id1;myORG_RESname1  
user_id1;myORG_RESname2

使用:

tr '\n' ';' < input_file > output_file没有给我想要的结果...

有什么想法可以实现吗?非常感谢任何帮助。

编辑:

这是我正在运行的实际 bash 脚本以供引用:

#!/bin/bash

# assign file descriptor for input fd
exec 3< /mountpoint/userlist
# assign file descriptor for output fd unfiltered
exec 4> /mountpoint/out_file_1.out
# assign file descriptor for output fd filtered
exec 5> /mountpoint/out_file_2.out
# assign file descriptor for output fd final
exec 6> /mountpoint/out_file_3.out

while IFS= read -ru 3 LINE; do
ldapsearch -h IPADDR -D "uid=admin,cn=Users,ou=Department,dc=myDC" -w somepwd "(uid=$LINE)" LDAPresource >&4
grep -E '(^uid=|Resource1|Resource2|Resource3)' /mountpoint/out_file_1.out | cut -d, -f1 >&5
grep -E 'TAMresource|uid=' /mountpoint/out_file_2.out | cut -d= -f2 >&6
#tr '\n' ';' < input_filename > file
done
# close fd #3 inputfile
exec 3<&-
# close fd #4 & 5 outputfiles
exec 4>&-
exec 5>&-
# exit with 0 success status
exit 0

最佳答案

使用您展示的示例,请尝试执行以下操作。使用 GNU awk 中显示的示例编写和测试。

awk '
match($0,/uid=[^,]*/){
val1=substr($0,RSTART+4,RLENGTH-4)
next
}
{
val=""
while($0){
match($0,/LDAPresource=[^ ]*/)
val=(val?val OFS:"")(val1 ";" substr($0,RSTART+13,RLENGTH-13))
$0=substr($0,RSTART+RLENGTH)
}
print val
}' Input_file

说明: 为以上添加详细说明。

awk '                                 ##Starting awk program from here.
match($0,/uid=[^,]*/){ ##Using match function to match regex uid= till comma comes in current line.
val1=substr($0,RSTART+4,RLENGTH-4) ##Creating val1 variable which has sub string of matched regex of above.
next ##next will skip all further statements from here.
}
{
val="" ##Nullifying val variable here.
while($0){ ##Running loop till current line value is not null.
match($0,/LDAPresource=[^ ]*/) ##using match to match regex from string LDAPresource= till space comes.
val=(val?val OFS:"")(val1 ";" substr($0,RSTART+13,RLENGTH-13)) ##Creating val which has val1 ; and sub string of above matched regex.
$0=substr($0,RSTART+RLENGTH) ##Saving rest of line in current line.
}
print val ##Printing val here.
}' Input_file ##Mentioning Input_file name here.

关于awk - grep,剪切并从文件中删除\n,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66077838/

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