搜索模式bash变量为awk

时间:2014-06-24 08:26:46

标签: linux bash awk

早上好

我一直在开发一个脚本,以便在Linux系统上进行某些搜索/比较/检索数据。 特别是我试图交叉的是来自以前由脚本创建的2个文件的数据,其中包含以下示例文本:

file_1:

/dev/abcde_vg/abcde_lv            APP     /bbdd_abcde                          
/dev/abcde_vg/system_lv           APP     /bbdd_abcde/system                   
/dev/abcde_vg/data_lv             DAT     /bbdd_abcde/data      

file_2:              

/bbdd_abcde         APP 
/bbdd_abcde/system      APP 
/bbdd_abcde/data            DAT

这里的目标是使用awk获取文件2的第一列的列表:

for i in `cat file_2|awk '{print $1}'
do ..........;done

并获得类似于以下声明的内容:

awk '$3 ~ "^/bbdd_abcde$"{print $0}' file_1
/dev/abcde_vg/abcde_lv            APP     /bbdd_abcde  

我尝试过以下方法但没有成功:

for i in `cat file_2|awk '{print $2}'
do
awk -v VAR1="$i" '$3 ~ VAR1{print $0}' (or awk -v VAR1="$i" '$3 ~ "^VAR1$"{print $0}' or similars)
done

根本没有成功。

============已解决============== 感谢您的回答,我申请的最终解决方案是使用AWK搜索完全匹配:

for cat file_2|awk '{print $2}' 做 awk -v VAR1 =" $ i" ' $ 3 == VAR1 {print $ 0}' 完成

这背后的想法更为复杂,问题本身就是使用bash交叉数据的200多个脚本的一部分

该脚本在每台服务器上生成一个文件,格式如前所述(

/dev/abcde_vg/abcde_lv            APP     /bbdd_abcde                          
/dev/abcde_vg/system_lv           APP     /bbdd_abcde/system                   
/dev/abcde_vg/data_lv             DAT     /bbdd_abcde/data  

这些文件是根据"它应该如何"文件在NAS上格式为:

/bbdd_          APP 
/bbdd_/system       APP 
/bbdd_/data                 DAT

验证"类型"分配给lv的磁盘是正确的。 (磁盘类型在脚本的其他部分计算出来)

所以我们的目标是比较每个挂载点磁盘类型" APP / DAT ......"在"它应该如何"

对我来说,主要的问题是搜索特定的挂载点,如" / bbdd_abcde"在一个文件上使用awk和"〜"我得到了很多结果而不是唯一的结果。 我需要使用" =="在我的awk声明中。

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

我希望我理解你的问题,试试这个:

awk 'NR==FNR{a[$1]=7;next}a[$3]' file2 file1

请注意,此行与您的代码之间存在差异。在我的行中,我没有做正则表达式匹配。因为如果您阅读/bbdd_abcde,则使用正则表达式匹配检查文件1中的所有行都将匹配。我不知道是否有所期待。

如果需要匹配,您可以更改代码的第二部分。

答案 1 :(得分:1)

此解决方案将文件1中的交叉引用键(APP,DATA)读入数组,然后使用file2打印匹配项。

awk 'FNR==NR{a[$2]=$1;next} $2 in a' file2 file1