我有2个文件:
1 - userfile.txt,格式为=>鲍勃:bobhash
2 - passfile.txt,格式为=> bobhash:bobpass
如果可能的话,我想通过单行命令给用户" bob"来获得bobpass。
所以,我真的这样做:
awk -F: '$1="bob" {print $2}' userfile.txt
# output: bobhash
# copy by using mouse
cat passfile.txt | grep 'bobhash' | awk -F: '{print $2}'
#output: bobpass
我想知道是否有更好的方法来做到这一点。我已经尝试了grep -f
,但没有运气。
答案 0 :(得分:1)
使用以下单行 awk
方法:
awk -F: 'NR == FNR{ if($1=="bob") p=$2; next}(p == $1){print $2}' userfile.txt passfile.txt
这里我们处理了两个文件 工作原理:
$ awk'NR == FNR {#some actions;下一个} #other condition {#other actions}'file1.txt file2.txt
处理多个文件时, awk 会按顺序读取每个文件, 一个接一个地按照命令中指定的顺序 线。特殊变量 NR 存储输入记录的总数 到目前为止,无论读取了多少文件,都会读取。的价值 NR 从1开始并一直增加,直到程序终止。 另一个变量 FNR ,存储从读取的记录数 正在处理的当前文件。 FNR 的值从1开始增加 到达当前文件的末尾,然后再次设置为1 只要读取下一个文件的第一行,依此类推。所以 当awk正在读取第一个文件时,条件 NR == FNR 仅为true。 因此,在上面的程序中,#some actions 表示的操作 当awk正在读取第一个文件时执行;所表明的行动 当awk正在读取第二个文件时,执行#other actions , 如果满足 #other condition 中的条件。 下一个结束时 需要第一个动作块来防止#other中的条件 评估条件,#other actions 中的操作 来自被执行,而awk正在读取第一个文件。
答案 1 :(得分:0)
运行awk
一次:
awk -v search=bob -F: 'NR==FNR && $1==search {hash=$2 };
NR>FNR && $1==hash {print "pw=" $2 }' userfile.txt passfile.txt
如果未找到匹配(或两次),您可以对某些控件进行更改。
答案 2 :(得分:0)
如果它有一些兴趣,这是一个全局解决方案,它将userfile.txt中的所有用户与passfile.txt中相应的密码匹配
awk -F":" 'NR==FNR{a[$2]=$1;next}a[$1]{print a[$1],$2}' users pass
答案 3 :(得分:-1)
以下是您已经拥有的修改后的版本,可以为您提供您所追求的目标。
简单的一个班轮:
cat passfile.txt | grep "$(awk -v user="bob" -F: '$1=user {print $2}' userfile.txt)" | awk -F: '{print $2}'
修改后用于脚本:
my_user="bob"
cat passfile.txt | grep "$(awk -v user="${my_user}" -F: '$1=user {print $2}' userfile.txt)" | awk -F: '{print $2}'
第二个选项增加了将用户作为变量传递的能力,而不是硬编码。如果您在脚本中使用它,则可以动态设置它,使其更加灵活。
仅使用awk的另一种解决方案:
awk -F: -v user="$(awk -F: '$1="bob" {print $2}' userfile.txt)" '$1=user {print $2}' passfile.txt