早上好
我一直在开发一个脚本,以便在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声明中。
感谢您的帮助
答案 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