4

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

对于其他人来说也是如此,但仍然未能以正确的编号格式获得示例输出,如上所示。

谁可以帮我这个事 ?

4

6 回答 6

6

%符号看起来是一个很好的分裂候选者。尝试:

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 %
于 2013-02-13T06:29:41.140 回答
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 %
于 2013-02-13T06:04:00.410 回答
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 %
于 2013-02-15T06:04:01.193 回答
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}}'
于 2013-02-13T06:12:47.677 回答
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
}

如果您必须对数据做任何事情而不是打印它,这很有用。

于 2013-02-13T12:06:39.023 回答
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 方法是先放一个 a \,然后是一个实际的换行符:

$ echo 'a#b' | sed 's/#/\
/'
a
b

Linux 比较特殊,因为 GNU 扩展了 sed 来识别 sed \n,但是在其他版本的 sed 中(比如 Mac 上),\n不解释为换行符,我们需要使用 POSIX 格式。然而,为了使它成为一个单行,我们使用$'...\\\n...'它告诉 shell 解释转义序列。首先,\\编码 a \,然后\n换行。

于 2018-06-15T19:47:42.953 回答