2016-05-10 33 views
1

Ich versuche, einige Metazeichen oder spezielle Zeichen aus der mu-Befehlszeile mit sed, awk oder tr oder einem handlichen, wenn auch schnellen Dienstprogramm zu entfernen. Außerdem habe ich einige Tricks auf meiner Ebene versucht, die arbeiten, aber in mehrere Zugabe von Befehlen .. genau das, was ich unten bekam ..So entfernen Sie mehrere Metazeichen mit awk oder sed

1) Die erste ist die genaue Ausgabe, die der Befehl Erträge ..

$ getent netgroup login_access_foxone 
login_access_foxone (-,cacti,) (-,multi,) (-,hipot,) (-,jack,) 

2) unten ist die sed-Sache, die mit awk kombiniert, um die Ausgabe zu liefern 'gewünscht.

$ getent netgroup login_access_foxone | sed 's/login_access_onefarm//g' | sed 's/)/\n/g' | awk 'BEGIN {FS=","}{print $2}' | grep -v ^$ 
cacti 
multi 
hipot 
jack 

3) Die nächste unten One mit tr Befehl, aber wieder hatte Schnitt zu verwenden, um die Ausgabe zu erhalten ..

$ getent netgroup login_access_foxone | tr -d '(' | tr ')' '\n' | cut -d, -f2 
cacti 
multi 
hipot 
jack 

4) Das mit awk ist aber wieder in zwei Teile

$ getent netgroup login_access_foxone | awk -v FS="[()]" '{for (i=2;i<=NF;i+=2) print $i }' | awk -F, '{print $2}' 
cacti 
multi 
hipot 
jack 

5) Ein paar mehr Tests mit sed aber im Moment nicht in der Lage zu entfernen „-“ & „“ und erhalten newline nach jedem Namen

$ getent netgroup login_access_foxone | sed 's/[(),]//g' 
login_access_foxone -cacti -multi -hipot -jack 

$ getent netgroup login_access_foxone | sed 's|[()-]||g' 
login_access_foxone ,cacti, ,multi, ,hipot, ,jack, 

6) versucht, mit einiger hässlichen Kombination sed, aber es ist proble mit Ausgabe, die Whitespaces ..

$ getent netgroup login_access_foxone | sed 's/[-,()]/\n/g' 
login_access_foxone 


cacti 




multi 




hipot 




jack 

enthält habe ich ihm die Idee für Leerzeilen mit folgendem Code aber agian Bedarf gelöscht werden haben sed mit einem anderen Rohr ..

$ getent netgroup login_access_foxone | sed 's/[-,()]/\n/g'|sed '/^\s*$/d' 

Antwort

3

awk zur Rettung!

$ awk -F, '{for(i=2;i<=NF;i+=2) print $i}' file 
cacti 
multi 
hipot 
jack 

oder

$ awk -v RS=, '!(NR%2)' file 
cacti 
multi 
hipot 
jack 

in der zweiten Alternative, teilen wir jede Zeile in Mini Datensätze durch Komma getrennt. Da die erforderlichen Felder zwischen zwei Kommas liegen, drucken wir die geradzahligen Datensätze aus, dh die durch zwei teilbare Datensatznummer. Die Reihenfolge ist natürlich erhalten (keine Überraschungen dort).

+0

@karakafa Sie den Auftrag brillant gehalten und es funktioniert wie erwartet, kannst du den zweiten awk-code erklären, den du gepostet hast. Ich werde es zur Antwort machen. Obwohl ich nur mit anderer sed & tr-Version suche, um von den Experten aussortiert zu werden. – rocky1981

+0

@karakafa ... sieht gut aus. – rocky1981

1

können Sie versuchen, diese sed, aber es ist ziemlich ausführlichen Vergleich zu awk:

sed 's/[^(]*(-,\([^,]*\),)/\1\n/g;s/\n$//' file 
1

Die kürzeste Lösung, die ich denken kann:

grep -Po ',\K\w*'

Beispiel:

grep -Po ',\K\w*' <<< 'login_access_foxone (-,cacti,) (-,multi,) (-,hipot,) (-,jack,)' 
cacti 
multi 
hipot 
jack 

Erläuterung:

\K: Blick hinter

\w: [a-zA-Z_]

*: Eine beliebige Anzahl von Übereinstimmungen

Verwandte Themen