![bash:对带有空格(如“?.?”)的字符串使用“cut -c”](https://linux22.com/image/1122743/bash%EF%BC%9A%E5%AF%B9%E5%B8%A6%E6%9C%89%E7%A9%BA%E6%A0%BC%EF%BC%88%E5%A6%82%E2%80%9C%EF%BC%9F.%EF%BC%9F%E2%80%9D%EF%BC%89%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%BD%BF%E7%94%A8%E2%80%9Ccut%20-c%E2%80%9D.png)
我只想从 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 wa
,0,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
而不是混乱的head
s、tail
s 和cut
s。
答案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"