使用awk作为参数的结果grep文件?

时间:2017-03-07 22:37:51

标签: bash awk grep hashtable cat

我有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,但没有运气。

4 个答案:

答案 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