bash - 如何通过字数将长字符串分成多个字符串

时间:2016-08-04 09:07:37

标签: linux bash shell

我想用单词计数来打破一个长字符串,然后每达到一定数量的单词就继续显示和中断。

例如。

我有一个字符串:

value="Aug 04 03:49:00.082205 ALERT IPX-NG dropped -- total: 4693845, count: 39254, rate: 1.88% ; OUTPUT QUEUE frampedd: active=1, delivered=73265000210 Aug 04 09:43:00.795817 ALERT IPX-NG dropped -- total: 4765909, count: 72064, rate: 1.91% ; OUTPUT QUEUE frampedd: active=0, delivered=74220627600"

我的预期输出是:

Aug 04 03:49:00.082205 ALERT IPX-NG dropped -- total: 4693845, count: 39254, rate: 1.88% ; OUTPUT QUEUE frampedd: active=1, delivered=73265000210
Aug 04 09:43:00.795817 ALERT IPX-NG dropped -- total: 4765909, count: 72064, rate: 1.91% ; OUTPUT QUEUE frampedd: active=0, delivered=74220627600"

我无法使用字符数,因为数字会有所不同。所以最好的选择是使用字数。

编辑:

嗨,大家好,我尝试使用sed命令,它似乎有效!

sed's /([^ [:space:]] {1,} [[:space:]] {1,}} {19} /& \ n /'

感谢那些有帮助的人......如果有以下情况,你可以给我更好的建议:D ..希望纯粹的bash命令,因为我无法在服务器上安装任何其他扩展程序。

2 个答案:

答案 0 :(得分:2)

如果所有字符串计数都没有改变,您可以使用xargs

$ value="Aug 04 03:49:00.082205 ALERT IPX-NG dropped -- total: 4693845, count: 39254, rate: 1.88% ; OUTPUT QUEUE frampedd: active=1, delivered=73265000210 Aug 04 09:43:00.795817 ALERT IPX-NG dropped -- total: 4765909, count: 72064, rate: 1.91% ; OUTPUT QUEUE frampedd: active=0, delivered=74220627600"

$ xargs -n 19 <<< "$value"
Aug 04 03:49:00.082205 ALERT IPX-NG dropped -- total: 4693845, count: 39254, rate: 1.88% ; OUTPUT QUEUE frampedd: active=1, delivered=73265000210
Aug 04 09:43:00.795817 ALERT IPX-NG dropped -- total: 4765909, count: 72064, rate: 1.91% ; OUTPUT QUEUE frampedd: active=0, delivered=74220627600

xargs man页面说明了这个标志-n

-n max-args, --max-args=max-args
        Use at most max-args arguments per command line.  Fewer than
        max-args arguments will be used if the size (see the -s
        option) is exceeded, unless the -x option is given, in which
        case xargs will exit.

答案 1 :(得分:1)

在AWK中:

awk '{{gsub(/^value="|"$/,""); for(i=1;i<=NF;i++) printf "%s%s",$i,(i%19?" ":"\n")}' file

或者如果您的字符串实际上不是以value="开头,那么您可以放弃gsub

awk '{for(i=1;i<=NF;i++) printf "%s%s",$i,(i%19?" ":"\n")}' file