如何搜索在 shell 脚本中作为参数传递的文件中的完整字符串?
How to search the full string in file which is passed as argument in shell script?
我正在传递一个参数,我必须在文件中匹配该参数并提取信息。请问我怎么才能得到它?
示例:
我在文件中有以下详细信息-
iMedical_Refined_load_Procs_task_id=970113
HV_Rawlayer_Execution_Process=988835
iMedical_HV_Refined_Load=988836
DHS_RawLayer_Execution_Process=988833
iMedical_DHS_Refined_Load=988834
如果我将 'hv' 作为参数传递,那么它应该选择 'iMedical_HV_Refined_Load' 并给出结果 - '988836'
如果我通过 'dhs' 那么它应该选择 - 'iMedical_DHS_Refined_Load' 并给出结果 = '988834'
我尝试了以下逻辑,但没有正确给出结果。我需要做哪些改变-
echo | tr a-z A-Z
g=${1^^}
echo $g
echo
val=$(awk -F= -v s="$g" '$g ~ s{print }' /medaff/Scripts/Aggrify/sltconfig.cfg)
echo "TASK ID is $val"
假设您的匹配条件是分隔符 _
之后的第一个字符串,并且需要的输出是 =
字符之后的数字,那么您可以试试这个 sed
$ sed -n "/_/I{s/[^=]*=\(.*\)//p}" input_file
$ read -r input
hv
$ sed -n "/_$input/I{s/[^=]*=\(.*\)//p}" input_file
988836
$ read -r input
dhs
$ sed -n "/_$input/I{s/[^=]*=\(.*\)//p}" input_file
988834
如果我没看错,2 个快速版本 -
$: cat 1
awk -F= -v s="_${1^^}_" '~s{print }' file
$: cat 2
sed -En "/_${1^^}_/{s/^.*=//;p;}" file
二者逻辑基本相同
纯bash-
$: cat 3
while IFS='=' read key val; do [[ "$key" =~ "_${1^^}_" ]] && echo "$val"; done < file
不过效率要低得多。
如果你确定只有一次命中,所有这些都可以通过 short-circuit 退出来改善一点,但在这么小的样本上根本无关紧要。如果您有更大的数据集要阅读,那么我强烈建议您将规范形式化,而不是“在这个集合中我应该得到...”。
我正在传递一个参数,我必须在文件中匹配该参数并提取信息。请问我怎么才能得到它?
示例:
我在文件中有以下详细信息-
iMedical_Refined_load_Procs_task_id=970113
HV_Rawlayer_Execution_Process=988835
iMedical_HV_Refined_Load=988836
DHS_RawLayer_Execution_Process=988833
iMedical_DHS_Refined_Load=988834
如果我将 'hv' 作为参数传递,那么它应该选择 'iMedical_HV_Refined_Load' 并给出结果 - '988836'
如果我通过 'dhs' 那么它应该选择 - 'iMedical_DHS_Refined_Load' 并给出结果 = '988834'
我尝试了以下逻辑,但没有正确给出结果。我需要做哪些改变-
echo | tr a-z A-Z
g=${1^^}
echo $g
echo
val=$(awk -F= -v s="$g" '$g ~ s{print }' /medaff/Scripts/Aggrify/sltconfig.cfg)
echo "TASK ID is $val"
假设您的匹配条件是分隔符 _
之后的第一个字符串,并且需要的输出是 =
字符之后的数字,那么您可以试试这个 sed
$ sed -n "/_/I{s/[^=]*=\(.*\)//p}" input_file
$ read -r input
hv
$ sed -n "/_$input/I{s/[^=]*=\(.*\)//p}" input_file
988836
$ read -r input
dhs
$ sed -n "/_$input/I{s/[^=]*=\(.*\)//p}" input_file
988834
如果我没看错,2 个快速版本 -
$: cat 1
awk -F= -v s="_${1^^}_" '~s{print }' file
$: cat 2
sed -En "/_${1^^}_/{s/^.*=//;p;}" file
二者逻辑基本相同
纯bash-
$: cat 3
while IFS='=' read key val; do [[ "$key" =~ "_${1^^}_" ]] && echo "$val"; done < file
不过效率要低得多。
如果你确定只有一次命中,所有这些都可以通过 short-circuit 退出来改善一点,但在这么小的样本上根本无关紧要。如果您有更大的数据集要阅读,那么我强烈建议您将规范形式化,而不是“在这个集合中我应该得到...”。