2016-08-04 2 views
1

Ich möchte eine lange Zeichenkette durch die Wortzählung unterbrechen und dann Anzeige fortsetzen und einmal jede bestimmte Anzahl von Wörtern erreichen.bash - Wie man eine lange Zeichenkette durch Wortzählung in mehrere Zeichenketten zerlegt

Zum Beispiel.

Ich habe eine Zeichenfolge:

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" 

meine erwartete Ausgabe ist:

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" 

ich nicht durch Charakter zählen als die Zahl variiert sein nutzen könnten. Die beste Wahl ist also die Wortzahl.

EDIT:

Hallo Leute .. Ich habe versucht, den sed Befehl und es scheint zu funktionieren!

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

dank denen, die helfen ..you kann mir bessere Vorschläge geben, wenn es gibt: D .. würde auf reinen Bash-Befehl hoffen, da ich keine andere Erweiterung auf dem Server installieren kann.

+0

für alle 18 Wörter, brechen die Zeichenfolge und werden substring..then weiter ... zum Beispiel: „4. August 03: 49: 00,082205 ALERT IPX- NG fallen gelassen - Total: 4693845, Anzahl: 39254, Bewertung: 1,88%; OUTPUT QUEUE Framepedd: aktiv = 1, geliefert = 73265000210 " hat 18 Wörter..so nach diesen 18 Wörtern möchte ich die Zeichenfolge in einen anderen Satz brechen und weitergehen –

Antwort

2

Wenn alle String-Zählung, Sie nicht ändern 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 

Die xargs man Seite sagt dies über die Flagge -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

Dies ist ein netter Ansatz. In der Tat können Sie Berechne die Zahl mit 'res =" $ {value // [^]} "' und dann enthält $ {# res} '37. Dies entfernt alles außer Leerzeichen in der Zeichenkette, um die Anzahl der Wörter zu erhalten muss nur die Zeichen im Ergebnis zählen – fedorqui

+1

Beachten Sie, dass dieser Befehl nicht wie erwartet funktioniert, wenn die Zeichenfolge Argumente zum Echo enthält, beispielsweise wenn die Zeichenfolge "-n" als Wort enthält und nicht gedruckt wird. – 123

+1

@ 123: ordnungsgemäß notiert? – Inian

1

In AWK verwenden können:

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

oder wenn Ihre Zeichenfolge nicht mitbeginnt, können Sie verlieren die gsub:

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

anstelle der harten Codierung 19, können Sie NF/2 + 1 sagen.Außerdem denke ich, dass es nicht die Zeichenfolge ist, die mit "value =" 'anstarrt, sondern eine Variablendeklaration. – fedorqui

+1

Sie haben recht, aber ich habe irgendwie erwartet, dass mehr als zwei Datensätze verarbeitet werden. –

+0

Hi, ich weise das tatsächlich zu string zu einem Variablennamen "value" .. also, wenn ich rufe .. ich werde nur "echo $ value" –

Verwandte Themen