93578
Goto Top

Suche nach einer Moeglichkeit im AWK oder cut die Inhalte von einer bestimmten Spalte bis Zeilenende anzeigen zu lassen

Hallo geehrte Mitsreiter/innen,

als erstes wünsche ich Euch allen in diese Zeit viel Gesundheit, Optimismus und Freude!

Ich habe eine kleine Frage an Linux-Gurus.

Ich habe folgende Datei:

muster1 muster:2
muster3;muster;;4
muster5:mu-ster6
muster7::muster8
muster9|muster10.25
muster11.mu ster12

Ich brauche aber nur alle inhalte ab Spalte 2 ausgeben:

muster:2
muster;;4
mu-ster6
:muster8
muster10.25
mu ster12

Ich bin auf der Suche nach einer Moeglichkeit im AWK/cut die Inhalte von einer bestimmten Spalte (z.B. hier $2) bis Zeilenende anzeigen zu lassen.
Ich wollte cut oder awk mehrere Zeichen als Trennzeichen vorgeben. So was, wie (;|:|\.|\=|\+| |\-). Ist das möglich? Keine Lust extra Befehlszeile für jedes Trennzeichen nacheinander zu machen.

Content-Key: 563742

Url: https://administrator.de/contentid/563742

Printed on: April 26, 2024 at 05:04 o'clock

Member: Lochkartenstanzer
Lochkartenstanzer Apr 08, 2020 updated at 10:39:22 (UTC)
Goto Top
Moin,

Zitat von @93578:

Ich bin auf der Suche nach einer Moeglichkeit im AWK/cut die Inhalte von einer bestimmten Spalte (z.B. hier $2) bis Zeilenende anzeigen zu lassen.

So was wie etwa:

awk -F  '[;:.=+ -]'  '{ for (x=2; x<=999; x++) {  printf" ", $x } }'

?

lks

PS: Kann man auch ganz leicht durch googlen finden. face-smile

https://www.google.com/search?q=awk+multiple+delimiters
https://www.google.com/search?q=awk+multiple+columns
Mitglied: 93578
93578 Apr 08, 2020 updated at 10:46:17 (UTC)
Goto Top
Vielen Dank. Aber in der Ergebnis.txt sehe ich nur Leerzeichen?
                                                                                        
Mitglied: 143728
143728 Apr 08, 2020 updated at 10:56:06 (UTC)
Goto Top
awk -F'[ ;:|.]+' '{rest=substr($0,length($1)+1);sub(/[ ;:|.]+/,"",rest);print rest}' test.txt  
Mitglied: 93578
93578 Apr 08, 2020 at 10:52:32 (UTC)
Goto Top
Es klappt ebenfalls nicht. Ich sehe die erste Datei als Ergebnis.
Mitglied: 143728
143728 Apr 08, 2020 updated at 10:58:06 (UTC)
Goto Top
Klappt hier einwandfrei, Ergebnis mit deinen Daten, du musst schon den Dateinamen hinten anpassen ...:
muster:2
muster;;4
mu-ster6
muster8
muster10.25
mu ster12
screenshot

btw. guckst du auch
https://stackoverflow.com/questions/19154996/awk-split-only-by-first-occ ...
Mitglied: 93578
93578 Apr 08, 2020 at 11:01:19 (UTC)
Goto Top
Ok. Du hast Recht. Mit der Beispiel-Datei klappt es. Aber mit der Original-Datei klappt es nicht. face-sad((
Mitglied: 143728
143728 Apr 08, 2020 updated at 11:04:43 (UTC)
Goto Top
Wir haben deine Datei nicht face-confused... Meine Glaskugel hat Corona-Ferien ... Was steht denn da genau drin bzw. welches Encoding, binär usw. und sofort., welche Distri, AWK Version?
"Funktioniert nicht" ist keine Fehlermeldung.
Mitglied: 93578
93578 Apr 08, 2020 updated at 11:06:34 (UTC)
Goto Top
Ok. Ich habe das Problem gefunden:

In meiner Datei als erste Spalte stehen IPs. Und die haben auch Punkte.

127.0.0.1:13.01.2020
122.0.0.2 14.06.2019
127.0.0.3.19.12.2018

Als Ergebnis:

0.0.1:13.01.2020
0.0.2 14.06.2019
0.0.3.19.12.2018

Und das ist ein Problem.
Mitglied: 143728
143728 Apr 08, 2020 updated at 11:07:08 (UTC)
Goto Top
Dann nehm halt die Punkte als delimiter raus, oder ein nutze gleich ein sed replace der IP-Adressen wenn sowieso nur IPs am Anfang stehen, dann brauchst du das ganze von oben nicht.
Mitglied: 93578
93578 Apr 08, 2020 at 11:07:29 (UTC)
Goto Top
Das Problem ist der Punkt als Trennzeichen.face-sad
Mitglied: 143728
143728 Apr 08, 2020 updated at 11:11:09 (UTC)
Goto Top
Na und ???? Hab doch in meiner letzten Antwort geschrieben nimm den Punkt aus den delimitern und dem Regex raus und gut is oder wenn nur IPs am Anfang gleich sed per Regex die IP replacen ...
Oder ist dir das jetzt schon zu schwer zwei Punkte aus meinem Code zu löschen? Schon wieder Freitag ...

awk -F'[ ;:|]+' '{rest=substr($0,length($1)+1);sub(/^[ ;:|]+/,"",rest);print rest}' test.txt  
Mitglied: 93578
93578 Apr 08, 2020 at 11:14:58 (UTC)
Goto Top
Danke! Aber den Punkt brauche ich auch. Also werde ich es mit sed versuchen.

Um diese Zeilen zu ermitteln habe ich folgendes grep benutzt:


also muss ich

^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).{1}

irgendwie mit sed kombinieren. Kann aber nicht finden wie?
Mitglied: 143728
Solution 143728 Apr 08, 2020 updated at 11:22:03 (UTC)
Goto Top
Hier die einfache Regex-Variante für die IP, kannst du dir ja abgucken und dann stattdessen die genauere IP-Regex einbauen ...
sed -re 's/^[0-9]{1,3}(\.[0-9]{1,3}){3}[ ;:|]+//' test.txt  
oder noch simpler
sed -re 's/^[0-9.]+[ ;:|]+//' test.txt  
Kann aber nicht finden wie?
Nicht finden, nachschlagen ist gesünder für die Birne! face-smile

So denn viel Spaß hier noch.
Ciao.
Mitglied: 93578
93578 Apr 08, 2020 updated at 11:32:29 (UTC)
Goto Top
Danke! Das hat geklappt!

sed -re 's/^[0-9]{1,3}(\.[0-9]{1,3}){3}.{1}//' IP-test.txt > IP-weg.txt

Ich habe von Linux gar keine Ahnung. Bringe mir quasi während Bearbeitung bei. Deswegen dort wo ein Profi wahrscheinlich 1 Zeile gebraucht hätte, stehen in meinem Script 5-6 Zeilen. Aber was sollst. Danke!
Member: Lochkartenstanzer
Solution Lochkartenstanzer Apr 08, 2020 at 11:22:34 (UTC)
Goto Top
Zitat von @93578:

Danke! Aber den Punkt brauche ich auch.

Naja, man könnte ja auch eganz einfach auf den profanen Gedanken kommen, daß die IP-Adresse vier Spalten bilden und man daher erst ab Spalte 6 statt 2 loslegt. face-smile

Also ehrlich. Due soltest Deinen eigenen Grips auch mal ein wenig ansprengen und nicht Dir alles vorkauen lassen.

Zu meiner zeit hat man erstmal sowas gelesen und erst dann sich an solche "schwierigen" Aufgaben gewagt. face-smile

lks


PS: "sed & awk" von Dale Dougherty und Arnold Robbins, erschienen bei O'Reilly kann ich nur empfehlen.
Mitglied: 93578
93578 Apr 08, 2020 updated at 11:32:15 (UTC)
Goto Top
<Naja, man könnte ja auch eganz einfach auf den profanen Gedanken kommen, daß die IP-Adresse vier Spalten bilden und man daher erst ab Spalte 6 statt 2 loslegt>
Tunnelblick wahrscheinlch! Peinlich, peinlich für mich! Danke!
Member: Lochkartenstanzer
Lochkartenstanzer Apr 08, 2020 at 11:36:52 (UTC)
Goto Top
Zitat von @93578:

Ich habe von Linux gar keine Ahnung.

awk und sed sind von linux unabhängig. Die gibt es auf fast jedem ordentlichen System seit über 40 Jahren.

Bringe mir quasi während Bearbeitung bei.

Eben nicht. Im Forum sich alles vorkauen lassen ist nicht "beibringen". Sondern manpages und Bücher lesen und ausprobieren!

lks
Mitglied: 93578
93578 Apr 08, 2020 updated at 11:58:25 (UTC)
Goto Top
Das war eine Frage, die sich nur auf 1 Zeile aus einem Bash mit über 100 Zeilen bezogen hat. Ich arbeite fast ein halbes Jahr daran. Ok. Du hättest dafür wahrscheinlich paar Tagen/Wochen gebraucht. Ich bin eben leider kein Programmierer und mache das nur als Nebenaufgabe, weil es mir Spaß macht und weil es noch keiner weltweit (zumindest öffentlich) geschafft hat. Aber gut.

Eine Friedenspfeife rauchen und nicht krank werden!

Frohe Ostern an alle!