2016-08-04 62 views
1

我想打破一个长字符串的字数,然后继续显示并每隔一定数量的字达到中断一次。bash - 如何打破一个长字符串的字数统计为多个字符串

例如。

我有一个字符串:

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 /([^ [:空间:]] {1,} [[:空间:]] {1,}){19}/& \ N /'

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

+0

为每18万个字,字符串将打破,并成为substring..then继续... 例如: “03年8月4日:49:00.082205 ALERT IPX的NG下降 - 总计:4693845,计数:39254,比率:1.88%; OUTPUT QUEUE frampedd:active = 1,delivered = 73265000210“ 有18个单词..所以在这18个单词之后,我想将字符串分解成另一个句子并继续 –

回答

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

这是一个很好的方法。通过执行'res =“$ {value // [^]}''来计算数字,然后'$ {#res}'将包含37.这会除去字符串中的所有空格,因此要获取单词的数量只需要对结果中的字符进行计数 – fedorqui

+1

注意,如果字符串包含回显参数,例如如果字符串包含“-n”作为一个字,它将不会被打印,此命令将无法正常工作 – 123

+1

@ 123:duly注意! – Inian

1

在AWK:

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

或者您的字符串实际上并不以开头,您可以松gsub

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

而不是硬编码19,你可以说NF/2 + 1。另外,我认为它不是用'value =“'盯着字符串,而是一个变量声明。 – fedorqui

+1

你是对的,但我期望有更多的两组数据来处理。 –

+0

嗨,我实际上分配了字符串到一个变量名称“值”..所以当我呼吁..我只是“回声$值” –

相关问题