使用awk以编号格式将单行拆分为多行

时间:2013-02-13 05:55:29

标签: linux shell scripting awk awk-formatting

我正在尝试使用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 %

与其他人类似,但仍未能以正确的编号格式获得样本输出,如上所示。

任何人都可以帮我吗?

6 个答案:

答案 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执行换行。