将 awk 的输出分配给变量
Assigning output from awk to variables
我正在尝试创建一个 bash 脚本来提取另一个脚本的输出 cpu_latency.bt
cpu_latency.bt
的输出每秒生成一次,类似于:
@usecs:
[0] 3 |@@@@@@@@@@ |
[1] 5 |@@@@@@@@@@@@@@@@@ |
[2, 4) 5 |@@@@@@@@@@@@@@@@@ |
[4, 8) 0 | |
[8, 16) 5 |@@@@@@@@@@@@@@@@@ |
[16, 32) 15 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|
[32, 64) 1 |@@@ |
[64, 128) 0 | |
[128, 256) 1 |@@@ |
@usecs:
[0] 1 |@@@ |
[1] 1 |@@@ |
[2, 4) 6 |@@@@@@@@@@@@@@@@@@@@@@ |
[4, 8) 2 |@@@@@@@ |
[8, 16) 4 |@@@@@@@@@@@@@@ |
我正在尝试捕获 仅 [
之后的第一个数字,然后是第一个 [=] 之前的数字17=](所以在上面的最后一行是 8
和 4
下面的脚本非常接近(处理 [0]
和 [1]
行除外):
duration=10
while read line
do
echo $line | cut -d "|" -f1 | sed 's/\[//g; s/\,//g; s/)//g' | awk '{print ,}' |
while read key value; do
print "The Key is "$key "and the Value is "$value
done
done < <(timeout $duration cpu_latency.bt | grep "\[")
但是 returns 的输出不太正确:
Error: no such file "The Key is 16"
Error: no such file "and the Value is 10"
Error: no such file "The Key is 16"
Error: no such file "and the Value is 9"
能否推荐一种更好的方法来将 $1 和 $3 的输出分配给变量,以便我可以将它们写入文件?
谢谢
CiCa
@RavinderSingh13 我不确定我是否误解了如何为此使用数组,但是使用 while 循环做更多的工作让我更接近我的目标:
while read key value
do
echo `hostname`".cpu-lat."$key"\"$value"\`date +"%s"`" >> /tmp/stats.out
done < <(
timeout $duration /root/bpftrace/cpu_latency.bt | awk '
match([=13=],/^\[[0-9]+/){
val=substr([=13=],RSTART+1,RLENGTH-1)
match([=13=],/[0-9]+ +\|/)
val2=substr([=13=],RSTART,RLENGTH)
sub(/ +\|/,"",val2)
print val,val2
val=val2=""
}' )
编辑: 从我的代码中看到 OP 的尝试后,现在添加以下内容。
awk -v host="$(hostname)" -v date="$(date +%s)" '
match([=10=],/^\[[0-9]+/){
val=substr([=10=],RSTART+1,RLENGTH-1)
match([=10=],/[0-9]+ +\|/)
val2=substr([=10=],RSTART,RLENGTH)
sub(/ +\|/,"",val2)
printf("%s.cpu-lat.%s\%s\%s\n", host, val, val2, date)
val=val2=""
}' Input_file
能否请您尝试以下。我在这里提到了 Input_file 传递给 awk
如果你想将 s 命令的输出传递给 awk 然后尝试这样: your_script | following awk code without Input_file
awk '
match([=11=],/^\[[0-9]+/){
val=substr([=11=],RSTART+1,RLENGTH-1)
match([=11=],/[0-9]+ +\|/)
val2=substr([=11=],RSTART,RLENGTH)
sub(/ +\|/,"",val2)
print val,val2
val=val2=""
}' Input_file
sed -e 's/[^0-9]/ /g' lala |gawk '{ print , substr([=10=],20,5) }'
'sed'删除所有非数字
'awk' 将打印第一个参数,并从位置 20 开始打印 5 个字符的文本。 (可以通过添加 0 将其更改为数字):
sed -e 's/[^0-9]/ /g' lala |gawk '{ print , 0+substr([=11=],20,5) }'
当然,Ed 是对的!:
gawk '{ gsub(/[^0-9]/," "); print , 0+substr([=12=],20,5) }'
这是你想要做的吗?
$ awk -F'[][,[:space:]]+' 'sub(/ \|.*/,""){print , $NF}' file
0 3
1 5
2 5
4 0
8 5
16 15
32 1
64 0
128 1
0 1
1 1
2 6
4 2
8 4
.
$ awk -v host="$(hostname)" -v date="$(date +%s)" -F'[][,[:space:]]+' '
sub(/ \|.*/,"") { printf "%s.cpu-lat.%s\%s\%s\n", host, , $NF, date }
' file
mypc.cpu-lat.076428453
mypc.cpu-lat.176428453
mypc.cpu-lat.276428453
mypc.cpu-lat.4[=11=]76428453
mypc.cpu-lat.876428453
mypc.cpu-lat.1676428453
mypc.cpu-lat.3276428453
mypc.cpu-lat.64[=11=]76428453
mypc.cpu-lat.12876428453
mypc.cpu-lat.076428453
mypc.cpu-lat.176428453
mypc.cpu-lat.276428453
mypc.cpu-lat.476428453
mypc.cpu-lat.876428453
我正在尝试创建一个 bash 脚本来提取另一个脚本的输出 cpu_latency.bt
cpu_latency.bt
的输出每秒生成一次,类似于:
@usecs:
[0] 3 |@@@@@@@@@@ |
[1] 5 |@@@@@@@@@@@@@@@@@ |
[2, 4) 5 |@@@@@@@@@@@@@@@@@ |
[4, 8) 0 | |
[8, 16) 5 |@@@@@@@@@@@@@@@@@ |
[16, 32) 15 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|
[32, 64) 1 |@@@ |
[64, 128) 0 | |
[128, 256) 1 |@@@ |
@usecs:
[0] 1 |@@@ |
[1] 1 |@@@ |
[2, 4) 6 |@@@@@@@@@@@@@@@@@@@@@@ |
[4, 8) 2 |@@@@@@@ |
[8, 16) 4 |@@@@@@@@@@@@@@ |
我正在尝试捕获 仅 [
之后的第一个数字,然后是第一个 [=] 之前的数字17=](所以在上面的最后一行是 8
和 4
下面的脚本非常接近(处理 [0]
和 [1]
行除外):
duration=10
while read line
do
echo $line | cut -d "|" -f1 | sed 's/\[//g; s/\,//g; s/)//g' | awk '{print ,}' |
while read key value; do
print "The Key is "$key "and the Value is "$value
done
done < <(timeout $duration cpu_latency.bt | grep "\[")
但是 returns 的输出不太正确:
Error: no such file "The Key is 16"
Error: no such file "and the Value is 10"
Error: no such file "The Key is 16"
Error: no such file "and the Value is 9"
能否推荐一种更好的方法来将 $1 和 $3 的输出分配给变量,以便我可以将它们写入文件?
谢谢 CiCa
@RavinderSingh13 我不确定我是否误解了如何为此使用数组,但是使用 while 循环做更多的工作让我更接近我的目标:
while read key value
do
echo `hostname`".cpu-lat."$key"\"$value"\`date +"%s"`" >> /tmp/stats.out
done < <(
timeout $duration /root/bpftrace/cpu_latency.bt | awk '
match([=13=],/^\[[0-9]+/){
val=substr([=13=],RSTART+1,RLENGTH-1)
match([=13=],/[0-9]+ +\|/)
val2=substr([=13=],RSTART,RLENGTH)
sub(/ +\|/,"",val2)
print val,val2
val=val2=""
}' )
编辑: 从我的代码中看到 OP 的尝试后,现在添加以下内容。
awk -v host="$(hostname)" -v date="$(date +%s)" '
match([=10=],/^\[[0-9]+/){
val=substr([=10=],RSTART+1,RLENGTH-1)
match([=10=],/[0-9]+ +\|/)
val2=substr([=10=],RSTART,RLENGTH)
sub(/ +\|/,"",val2)
printf("%s.cpu-lat.%s\%s\%s\n", host, val, val2, date)
val=val2=""
}' Input_file
能否请您尝试以下。我在这里提到了 Input_file 传递给 awk
如果你想将 s 命令的输出传递给 awk 然后尝试这样: your_script | following awk code without Input_file
awk '
match([=11=],/^\[[0-9]+/){
val=substr([=11=],RSTART+1,RLENGTH-1)
match([=11=],/[0-9]+ +\|/)
val2=substr([=11=],RSTART,RLENGTH)
sub(/ +\|/,"",val2)
print val,val2
val=val2=""
}' Input_file
sed -e 's/[^0-9]/ /g' lala |gawk '{ print , substr([=10=],20,5) }'
'sed'删除所有非数字 'awk' 将打印第一个参数,并从位置 20 开始打印 5 个字符的文本。 (可以通过添加 0 将其更改为数字):
sed -e 's/[^0-9]/ /g' lala |gawk '{ print , 0+substr([=11=],20,5) }'
当然,Ed 是对的!:
gawk '{ gsub(/[^0-9]/," "); print , 0+substr([=12=],20,5) }'
这是你想要做的吗?
$ awk -F'[][,[:space:]]+' 'sub(/ \|.*/,""){print , $NF}' file
0 3
1 5
2 5
4 0
8 5
16 15
32 1
64 0
128 1
0 1
1 1
2 6
4 2
8 4
.
$ awk -v host="$(hostname)" -v date="$(date +%s)" -F'[][,[:space:]]+' '
sub(/ \|.*/,"") { printf "%s.cpu-lat.%s\%s\%s\n", host, , $NF, date }
' file
mypc.cpu-lat.076428453
mypc.cpu-lat.176428453
mypc.cpu-lat.276428453
mypc.cpu-lat.4[=11=]76428453
mypc.cpu-lat.876428453
mypc.cpu-lat.1676428453
mypc.cpu-lat.3276428453
mypc.cpu-lat.64[=11=]76428453
mypc.cpu-lat.12876428453
mypc.cpu-lat.076428453
mypc.cpu-lat.176428453
mypc.cpu-lat.276428453
mypc.cpu-lat.476428453
mypc.cpu-lat.876428453