Wie erhalte ich die zweite Spalte aus der Befehlsausgabe?


152

Die Ausgabe meines Befehls ist ungefähr so:

1540 "A B"
   6 "C"
 119 "D"

Die erste Spalte ist immer eine Zahl, gefolgt von einem Leerzeichen und einer Zeichenfolge in doppelten Anführungszeichen.

Mein Zweck ist es, nur die zweite Spalte zu erhalten, wie:

"A B"
"C"
"D"

Ich wollte verwenden <some_command> | awk '{print $2}', um dies zu erreichen. Die Frage ist jedoch, dass einige Werte in der zweiten Spalte Leerzeichen enthalten, die zufällig das Standardtrennzeichen für awkdie Trennung der Felder sind. Daher ist die Ausgabe durcheinander:

"A
"C"
"D"

Wie erhalte ich den Wert der zweiten Spalte (mit gepaarten Anführungszeichen) sauber?



1
Ich habe es versucht awk '{$1=""; print $0}', aber es hat immer noch einen führenden Leerraumcharakter. Es könnte von entfernt werden sed '/^ //'. Könnte dies jedoch getan werden awk?
Qiang Xu

Antworten:


29

Oder verwenden Sie sed & regex.

<some_command> | sed 's/^.* \(".*"$\)/\1/'

Kürzere cmd, da Sie keine Start- und Endmarkierungen benötigen:<some_command> | sed 's/.* \(".*"\)/\1/'
Timo

197

Verwenden Sie -F [field separator], um die Zeilen auf "s zu teilen :

awk -F '"' '{print $2}' your_input_file

oder für die Eingabe von der Leitung

<some_command> | awk -F '"' '{print $2}'

Ausgabe:

A B
C
D

3
Das ist gut, aber ich möchte auch die ursprünglichen Zitate in der Umgebung. Könnte es gemacht werden? Vielen Dank.
Qiang Xu

5
Sie könnten betrügen und awk's Druck auf'{print "\""$2"\""}'
Alex

Ja, das funktioniert. Vielen Dank, Alex! Übrigens so viele Zitate, :)
Qiang Xu

@Alex, könnten Sie erklären, wie Sie die doppelten Anführungszeichen und den umgekehrten Schrägstrich verwendet haben, um das zu erhalten, was die Operation wollte?
Timo

1
@ Timo Die Aufschlüsselung der Anführungszeichen und Backslashes kann als vorgestellt werden "\"" + $2 + "\"". Die umgebenden Anführungszeichen geben an, dass etwas an die Ausgabe angehängt werden soll, und das maskierte Anführungszeichen ( \") wird gedruckt. Um dies zu veranschaulichen, würde es so aussehen, wenn wir $2anstelle von Anführungszeichen Leerzeichen einfügen möchten : '{print " "$2" "}'. Wir können auch Formatabstände hinzufügen, um das Grok ein wenig zu vereinfachen:'{print " " $2 " "}'
Tom

80

Wenn Sie etwas anderes als "awk" verwenden könnten, versuchen Sie dies stattdessen

echo '1540 "A B"' | cut -d' ' -f2-

-d ist ein Trennzeichen, -f ist das zu schneidende Feld und mit -f2- wollen wir das 2. Feld bis zum Ende schneiden.


Dies hat mir geholfen, Folgendes zu versuchen (Commit-ID einer Datei in git abrufen): git annotate myfile.cpp | grep '2016-07' | Kopf -1 | cut -f1
serup

2
Dies ist gut, funktioniert aber nicht, wenn das Trennzeichen mehr als ein Zeichen lang ist. Hier bietet sich die awk-Lösung an
smac89

2
Warum wird ein Leerzeichen danach nicht mehr verwendet -d? Auf diese Weise sieht es etwas seltsam aus.
Chris Stryczynski

43

Dies sollte funktionieren, um eine bestimmte Spalte aus der Befehlsausgabe "Docker-Images" zu entfernen:

REPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE
ubuntu                              16.04               12543ced0f6f        10 months ago       122 MB
ubuntu                              latest              12543ced0f6f        10 months ago       122 MB
selenium/standalone-firefox-debug   2.53.0              9f3bab6e046f        12 months ago       613 MB
selenium/node-firefox-debug         2.53.0              d82f2ab74db7        12 months ago       613 MB


docker images | awk '{print $3}'

IMAGE
12543ced0f6f
12543ced0f6f
9f3bab6e046f
d82f2ab74db7

Dadurch wird die dritte Spalte gedruckt


Haben Sie Docker-Bilder gesehen? awk '{print $ 5}'?
Shashi Ranjan

17

Dafür brauchst du kein awk. Die Verwendung readin der Bash-Shell sollte ausreichen, z

some_command | while read c1 c2; do echo $c2; done

oder:

while read c1 c2; do echo $c2; done < in.txt

13

Wenn Sie GNU awk haben, ist dies die gewünschte Lösung:

$ awk '{print $1}' FPAT='"[^"]+"' file
"A B"
"C"
"D"

0
awk -F"|" '{gsub(/\"/,"|");print "\""$2"\""}' your_file

0
#!/usr/bin/python
import sys 

col = int(sys.argv[1]) - 1

for line in sys.stdin:
    columns = line.split()

    try:
        print(columns[col])
    except IndexError:
        # ignore
        pass

Angenommen, Sie benennen das Skript als co. Führen Sie beispielsweise Folgendes aus, um die Dateigröße zu ermitteln (im Beispiel wird davon ausgegangen, dass Sie Linux verwenden, das Skript selbst ist jedoch vom Betriebssystem unabhängig): -

ls -lh | co 5

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.