我正在尝试使用awk命令将值拆分为三个部分。需要帮助才能打入3。
内容= 1. 11683 (<server01>: du.size[/,free] : 0.5 % 2. 21683 (<server02>: du.size[/,free] : 1.5 % 3. 31683 (<server03>: du.size[/,free] : 3.5 %
我希望上面的内容在编号系统中分成3行。
需要输出样本:
1. 11683 (<server01>: du.size[/,free] : 0.5 %
2. 21683 (<server02>: du.size[/,free] : 1.5 %
3. 31683 (<server03>: du.size[/,free] : 3.5 %
我尝试过以下命令:
echo $content | awk -F"3. " '{ print $2 }'
我得到了
31683 (<server03>: du.size[/,free] : 3.5 %
与其他人类似,但仍未能以正确的编号格式获得样本输出,如上所示。
任何人都可以帮我吗?
答案 0 :(得分:5)
%
符号看起来像是一个很好的候选人。尝试:
sed 's/% /%\n/g'
测试:
echo "1. 11683 (<server01>: du.size[/,free] : 0.5 % 2. 21683 (<server02>: du.size[/,free] : 1.5 % 3. 31683 (<server03>: du.size[/,free] : 3.5 %" | sed 's/% /%\n/g'
结果:
1. 11683 (<server01>: du.size[/,free] : 0.5 %
2. 21683 (<server02>: du.size[/,free] : 1.5 %
3. 31683 (<server03>: du.size[/,free] : 3.5 %
答案 1 :(得分:4)
您可以改为使用sed
:
sed "s#[^^]\([0-9]\.\) #\n\1 #g"
示例:
[~/Desktop]
==> echo "1. 11683 (<server01>: du.size[/,free] : 0.5 % 2. 21683 (<server02>: du.size[/,free] : 1.5 % 3. 31683 (<server03>: du.size[/,free] : 3.5 %" | sed "s#[^^]\([0-9]
\.\) #\n\1 #g"
1. 11683 (<server01>: du.size[/,free] : 0.5 %
2. 21683 (<server02>: du.size[/,free] : 1.5 %
3. 31683 (<server03>: du.size[/,free] : 3.5 %
答案 2 :(得分:3)
perl -pe 's/(\d+\.\s)/\n$1/g'
测试:
> echo "1. 11683 (<server01>: du.size[/,free] : 0.5 % 2. 21683 (<server02>: du.size[/,free] : 1.5 % 3. 31683 (<server03>: du.size[/,free] : 3.5 %" | perl -pe 's/(\d+\.\s)/\n$1/g'
1. 11683 (<server01>: du.size[/,free] : 0.5 %
2. 21683 (<server02>: du.size[/,free] : 1.5 %
3. 31683 (<server03>: du.size[/,free] : 3.5 %
答案 3 :(得分:1)
试
echo "1. 11683 (<server01>: du.size[/,free] : 0.5 % 2. 21683 (<server02>: du.size[/,free] : 1.5 % 3. 31683 (<server03>: du.size[/,free] : 3.5 %" | awk '{n = split($0,array,"%"); for (i = 0; i < n-1; ++i){gsub("^ ","",array[i+1]);print array[i+1]" %",i}}'
答案 4 :(得分:1)
您的数据显示为元素数量固定。
{
print $1, $2, $3, $4, $5, $6, $7
print $8, $9, $10, $11, $12, $13, $14
print $15, $16, $17, $18, $19, $20, $21
}
如果您必须对打印以外的数据执行任何操作,则非常有用。
答案 5 :(得分:1)
对于适用于Mac的符合POSIX标准的答案:
sed -E $'s/ ([0-9]+\\. )/\\\n\\1/g'
示例:
$ echo "1. 11683 (<server01>: du.size[/,free] : 0.5 % 2. 21683 (<server02>: du.size[/,free] : 1.5 % 3. 31683 (<server03>: du.size[/,free] : 3.5 %" | sed -E $'s/ ([0-9]+\\. )/\\\n\\1/g'
1. 11683 (<server01>: du.size[/,free] : 0.5 %
2. 21683 (<server02>: du.size[/,free] : 1.5 %
3. 31683 (<server03>: du.size[/,free] : 3.5 %
-E
打开更好的正则表达式语法,以便我们+
匹配一个或多个内容,我们只需要(...)
来捕获组而不是\(...\)
。
s/.../.../g
s/
表示进行字符串替换。 /g
表示在第一次替换一行后不要停止。
/ ([0-9]+\. )/
匹配' 2. '
和' 3. '
,并捕获'2. '
和'3. '
以供日后使用。在捕获组之前包括前导空格可以避免在'1.'
之前添加额外的换行符,因为'1.'
位于行的开头且前面没有空格。捕获中的尾随空格会过滤掉'1.5'
。
/\n\1/
\n
是换行符,\1
是第一个括号捕获组。
$'...'
和额外的反斜杠给sed换行的POSIX方法是放一个\
然后放一个实际的换行符:
$ echo 'a#b' | sed 's/#/\
/'
a
b
Linux很特别,因为GNU扩展了sed以识别\n
,但在其他版本的sed中(如在Mac上),\n
不会被解释为换行符,我们需要使用POSIX格式。但是,为了使它成为单行,我们使用$'...\\\n...'
告诉shell解释转义序列。首先,\\
对\
进行编码,然后\n
执行换行。