2010-04-08 6 views
21

Ich habe ein Skript, das jedes Mal zwei Zeilen als Ausgabe generiert. Ich bin wirklich nur an der zweiten Zeile interessiert. Außerdem interessiert mich nur der Text, der zwischen einem Paar # in der zweiten Zeile steht. Zusätzlich wird zwischen den Hashes ein weiteres Trennzeichen verwendet:^A. Es wäre toll, wenn ich auch auseinander jeden Teil des Textes brechen kann, dass^A-begrenzt ist (Beachten Sie, dass^A SOH Sonderzeichen und kann mit Strg-A eingegeben werden)Die n-te Zeile der Textausgabe erhalten

Antwort

6
your.program | tail +2 | cut -d# -f2 

sollten Sie 2/3 des Weges.

+1

das beste Dienstprogramm geschnitten auf eine undeterminate Menge von Werten zu verwenden, die von^A begrenzt werden? – syker

+1

Ich bin mir nicht sicher. Ich verstehe nicht wirklich, was dein Ziel in Bezug auf die^A's ist. Um sie in etwas anderes zu verwandeln? Zeilenumbrüche? – Grumdrig

0

bash:

read 
read line 
result="${line#*#}" 
result="${result%#*}" 
IFS=$'\001' read result -a <<< "$result" 

$result ist jetzt ein Array, das die Elemente enthält, die Sie interessiert sind gerade Rohr der Ausgabe des Skripts zu diesem..

57
output | sed -n '1p' #prints the 1st line of output 

output | sed -n '1,3p' #prints the 1st, 2nd and 3rd line of output 
+2

Ihre Antwort ist besser. Nicht sicher, warum ein anderer akzeptiert wird. Sehr verwirrend. – Fuser97381

+1

Genau das habe ich gesucht. Vielen Dank! @ n-1-1 Wissen Sie, ob es möglich ist, mit sed die Zeilen 1,3,5 statt 1-5 anzugeben? Ich konnte selbst nichts finden. – Olshansk

1

Ich würde wahrscheinlich awk dafür verwenden.

your_script | awk -F# 'NR == 2 && NF == 3 { 
          num_tokens=split($2, tokens, "^A") 
          for (i = 1; i <= num_tokens; ++i) { 
           print tokens[i] 
          } 
          }' 

Dies sagt

1. Set the field separator to # 
2. On lines that are the 2nd line, and also have 3 fields (text#text#text) 
3. Split the middle (2nd) field using "^A" as the delimiter into the array named tokens 
4. Print each token 

Offensichtlich ist dies eine Menge von Annahmen macht. Sie müssen es möglicherweise optimieren, wenn beispielsweise # oder^A in den Daten legitim erscheinen kann, ohne Trennzeichen zu sein. Aber so etwas sollte dir den Anfang machen. Sie müssen vielleicht nawk oder gawk oder so etwas verwenden, ich bin mir nicht ganz sicher, ob plain awk das Teilen eines Steuerzeichens verarbeiten kann.

0

ist hier eine mögliche Lösung awk

awk -F"#" 'NR==2{ 
for(i=2;i<=NF;i+=2){ 
    split($i,a,"\001") # split on SOH 
    for(o in a) print o # print the splitted hash 
} 
}' file 
1

Verbesserung Grumdrig Antwort:

your.program | head -n 2| tail -1 | cut -d# -f2 
Verwandte Themen