String BASH-从字符串中提取数据
我有一个返回数千行数据的日志,我想从中提取一些值 日志中只有一行包含unquieString BASH-从字符串中提取数据,string,bash,variables,String,Bash,Variables,我有一个返回数千行数据的日志,我想从中提取一些值 日志中只有一行包含unquie单元参考,因此我可以使用以下方法对此进行grep: grep“unit=Central-C152”logfile.txt 产生类似于以下内容的输出行: a3cd23e,85d58f5,53f534abef7e7,unit=Central-C152,locale=32325687-8595-9856-1236-12546975,11="School",1="Mr Green",2="Qual",3="SWE",8="r
单元
参考,因此我可以使用以下方法对此进行grep:
grep“unit=Central-C152”logfile.txt
产生类似于以下内容的输出行:
a3cd23e,85d58f5,53f534abef7e7,unit=Central-C152,locale=32325687-8595-9856-1236-12546975,11="School",1="Mr Green",2="Qual",3="SWE",8="report",5="channel",7="reset",6="velum"
行的格式可能会改变,因为值的顺序并不总是在同一位置
我正试图找出如何将2和7的值放入单独的变量中。
我曾考虑过cut
on,或=但由于值不是按设定顺序排列的,所以我无法找到最好的方法
我正试图得到:
var state=不带引号的值2
var模式=不带引号的7的值
有人能建议最好的方法吗
谢谢请尝试以下创建变量值
state=$(awk '/unit=Central-C152/ && match($0,/2=\"[^"]*/){print substr($0,RSTART+3,RLENGTH-3)}' Input_file)
mode=$(awk '/unit=Central-C152/ && match($0,/7=\"[^"]*/){print substr($0,RSTART+3,RLENGTH-3)}' Input_file)
您也可以通过执行以下操作来打印它们
echo "$state"
echo "$mode"
解释:现在也添加命令解释
awk ' ##Starting awk program here.
/unit=Central-C152/ && match($0,/2=\"[^"]*/){ ##Checking condition if a line has string (unit=Central-C152) and using match using REGEX to check from 2 to till "
print substr($0,RSTART+3,RLENGTH-3) ##Printing substring starting from RSTART+3 till RLENGTH-3 characters.
}
' Input_file ##Mentioning Input_file name here.
请尝试以下方法来创建变量的值
state=$(awk '/unit=Central-C152/ && match($0,/2=\"[^"]*/){print substr($0,RSTART+3,RLENGTH-3)}' Input_file)
mode=$(awk '/unit=Central-C152/ && match($0,/7=\"[^"]*/){print substr($0,RSTART+3,RLENGTH-3)}' Input_file)
您也可以通过执行以下操作来打印它们
echo "$state"
echo "$mode"
解释:现在也添加命令解释
awk ' ##Starting awk program here.
/unit=Central-C152/ && match($0,/2=\"[^"]*/){ ##Checking condition if a line has string (unit=Central-C152) and using match using REGEX to check from 2 to till "
print substr($0,RSTART+3,RLENGTH-3) ##Printing substring starting from RSTART+3 till RLENGTH-3 characters.
}
' Input_file ##Mentioning Input_file name here.
您最好在Awk中完成所有处理
awk -F, '/unit=Central-C152/ {
for(i=1;i<=NF;++i)
if($i ~ /^[27]="/) {
b[++k] = $i
sub(/^[27]="/, "", b[k])
sub(/"$/, "", b[k])
gsub(/\\/, "", b[k])
}
print "state " b[1] ", mode " b[2]
}' logfile.txt
awk-F'/unit=Central-C152/{
对于(i=1;i您最好在Awk中完成所有处理
awk -F, '/unit=Central-C152/ {
for(i=1;i<=NF;++i)
if($i ~ /^[27]="/) {
b[++k] = $i
sub(/^[27]="/, "", b[k])
sub(/"$/, "", b[k])
gsub(/\\/, "", b[k])
}
print "state " b[1] ", mode " b[2]
}' logfile.txt
awk-F'/unit=Central-C152/{
对于(i=1;i假设变量中已经有行,例如:
line="$(grep 'unit=Central-C152' logfile.txt | head -1)"
然后,您可以简单地使用bash
的内置参数替换功能:
f2=${line#*2=\"} ; f2=${f2%%\"*} ; echo ${f2}
f7=${line#*7=\"} ; f7=${f7%%\"*} ; echo ${f7}
每行上的第一个命令将删除该行的第一部分,直到并包括=”
。然后第二个命令将删除第一个引号以外的所有内容。当然,第三个命令只是回显该值
当我对输入行运行这些命令时,我看到:
Qual
reset
据我所见,这就是您所追求的。假设您已经在一个变量中有了行,例如:
line="$(grep 'unit=Central-C152' logfile.txt | head -1)"
然后,您可以简单地使用bash
的内置参数替换功能:
f2=${line#*2=\"} ; f2=${f2%%\"*} ; echo ${f2}
f7=${line#*7=\"} ; f7=${f7%%\"*} ; echo ${f7}
每行上的第一个命令将删除该行的第一部分,直到并包括=”
。然后第二个命令将删除第一个引号以外的所有内容。当然,第三个命令只是回显该值
当我对输入行运行这些命令时,我看到:
Qual
reset
从我看来,这就是你想要的