bash:对带有空格(如“?.?”)的字符串使用“cut -c”

bash:对带有空格(如“?.?”)的字符串使用“cut -c”

我只想从 watingForHDD 中获取第三个字符。有什么想法吗?

(我的想法是记录一些有关已用系统容量等的数据......)

#!/bin/bash
x="`top -d 1 -n 1`"
echo "$x"
waitingForHDD=`echo "$x" | head -n3 | tail -n1 | cut -d"," -f9,10`
echo "$waitingForHDD"     #output(with 2 spaces in the beginning):   0,6 wa 
b=`echo "$waitingForHDD" | cut -c3`
echo "$b"      #output(i mean WTF? thats not even in waitingForHDD): B

答案1

的输出top使用以下格式:在 中0,6 wa0,6以粗体显示。使用批处理模式 ( -b) 可禁用它:

$ top -bd 1 -n 1 | head -n3 | tail -n1 | cut -d, -f5 | cut -c3
1

(我处于不同的地区,因此第一个字段cut有所不同。)

尝试top -d 1 -n 1 | head -n3 | tail -n1 | cut -d, -f5 | less观察特殊字符的实际作用。

尽管如此,您最好使用类似的符号,awk而不是混乱的heads、tails 和cuts。

答案2

正如 @muru 指出的那样,问题在于top使用ANSI 转义序列格式化其输出。您可以通过管道传输类似程序来od查看非打印字符。例如,此命令打印第 3 行的“wa”和“hi”字段top

$ top -d 1 -n 1 | grep ^% | cut -d"," -f5,6

我的系统上的输出是:

1.0哇, 0.0你好

我们来看看非打印字符:

$ top -d 1 -n 1 | grep ^% | cut -d"," -f5,6 | od -c
0000000 033   (   B 033   [   m 033   [   3   9   ;   4   9   m 033   [
0000020   1   m           1   .   0     033   (   B 033   [   m 033   [
0000040   3   9   ;   4   9   m   w   a   , 033   (   B 033   [   m 033
0000060   [   3   9   ;   4   9   m 033   [   1   m           0   .   0
0000100     033   (   B 033   [   m 033   [   3   9   ;   4   9   m   h
0000120   i  \n
0000122

如上所示,第三个字符是 a B,这就是您得到的。因此,假设您想要一个脚本,i) 打印 的所有top输出,ii) 打印第三行的“wa”和“hi”字段,iii) 打印“wa”字段中的数字,您可以执行以下操作:

#!/usr/bin/env bash

x="$(top -d 1 -n 1)"
echo "$x"
waitingForHDD=$(grep ^% <<<"$x" | cut -d"," -f5,6)
echo "$waitingForHDD"     
b=$(grep -oP '^.*?\K[.\d]+(?= )' <<<"$waitingForHDD" )
echo "$b"

相关内容