在下面的示例中,inet 前面有 4 个空格。
wolf@linux:~$ ip address show eth0 | grep 'inet '
inet 10.10.10.10/24 brd 10.10.10.255 scope global dynamic eth0
wolf@linux:~$
像这个例子一样,我如何计算空格的数量。
该示例很简单,因为它只有 4 个空格。
如果它有更多怎么办?数百、数千?
是否有捷径可寻?
答案1
您可以使用tr
删除所有不是您感兴趣的字符的内容,然后wc
计算剩余的字符:
ip address show eth0 | grep 'inet ' | tr -d -c ' ' | wc -m
这可以很好地扩展到大量文本,tr
非常高效。
但请注意,对于tr
包含 GNU的某些实现tr
,仅适用于单字节字符(例如空格字符)。
如果您只想计算前导空格,则需要比以下功能更强大的东西tr
:
ip address show eth0 | grep 'inet ' | sed 's/[^ ].*$//' | tr -d '\n' | wc -m
这将删除每行中不包含前导空格的所有部分,然后删除换行符和计数。
看如何统计每一行中特定字符的个数?如果您对每行的计数感兴趣。
答案2
要计算每行开头的空格字符数,您可以执行以下操作:
awk -F '[^ ].*' '{print length($1)}'
它打印第一个字段的长度(以字符数为单位),其中字段由以非空格开头的任何字符序列分隔。
要报告在输入的任何行开头找到的最大空白量(最大缩进),使用 GNU wc
:
sed 's/[^[:blank:]].*//' | wc -L
报告的空白量为显示宽度在制表位为 8 列的显示设备上:
$ printf '\tfoo\n' | sed 's/[^[:blank:]].*//' | wc -L
8
$ printf '\u3000foo\n' | sed 's/[^[:blank:]].*//' | wc -L
2
U+3000 字符(表意空格字符,在我的语言环境中被分类为空白)是采用 UTF-8 编码为 3 个字节的双角字符。
如果您希望以字符数来报告最大长度:
sed 's/[^[:blank:]].*//;s/./x/g' | wc -L
(s/./x/g
将每行上的每个字符转换为x
我们知道显示宽度为 1 的字符)。
或者按字节数计算:
sed 's/[^[:blank:]].*//' |
LC_ALL=C tr -c '\n' '[x*]' | # convert each byte other than newline to x
wc -L
答案3
打印前导空格数:
awk '{print match($0,/[^ ]|$/)-1}' file
match($0,/[^ ]|$/)
匹配第一个非空格 ([^ ]
) 或行尾 ($
) 并返回其位置。打印空格数:
awk -F '[ ]' '{print (NF?NF-1:0)}' file
-F '[ ]'
将字段分隔符设置为空格。NF
是字段的数量。三元表达式的意思是:“如果 NF 不为 0,则打印 NF-1,否则打印 0”。这是因为如果该行为空,则 NF 为 0。
答案4
我举了下面的例子
`echo " praveen"| grep -o "^ *"| awk '{print length($0)}'`6
output
6
Python
>>> a=" praveen"
>>> import re
>>> k=re.compile(r'^ *')
>>> m=re.search(k,a)
>>> print len(m.group())
6
>>>