it-swarm.com.de

Kopieren Sie bestimmten Text aus einer mehrzeiligen Datei und fügen Sie ihn mithilfe des Terminals automatisch in eine andere Datei ein

meine Frage betrifft die Textverarbeitung:

In einer Liste habe ich die IP-Adressen und Computernamen in folgendem Format:

IP address: 192.168.1.25
Computer name: computer7office
IP address: 192.168.1.69
Computer name: computer22office
IP address: 192.168.1.44
Computer name: computer12personal

Die Ausgabe brauche ich:

This computer ip address is xxx.xxx.x.xx and is under the name zzzzzzzzzz

Wie kann ich die IPs und Namen automatisch über die Befehlszeile aus der Liste in die Ausgabedatei kopieren? Könnten Sie bitte Ihren Befehl erläutern, da es schade ist, wenn ich Dinge kopieren/einfügen muss, die ich nicht verstehe.

In sed können Sie unter der Annahme, dass sich Ihre Liste in einer Datei mit dem Namen file befindet, Folgendes verwenden:

sed -n '/ss: /N;s/\n//;s/IP address:/This computer ip address is/;s/Computer name:/ and is under the name/p' file
  • -n drucke nichts, bis wir danach fragen
  • /ss: / finde das Muster ss: (um die Linien mit IP address: abzugleichen)
  • N lies auch die nächste Zeile, damit wir uns ihnen anschließen können
  • ; trennt Befehle wie in der Shell
  • s/old/new/ ersetze old durch new
  • s/\n// löscht die neue Zeile zwischen den beiden Zeilen
  • p druckt die Zeilen aus, an denen wir gearbeitet haben

Wenn Sie sehen, was Sie wollen, wiederholen Sie den Befehl und fügen Sie > newfile am Ende hinzu, um die geänderte Datei in newfile zu schreiben.

Besser lesbar:

sed -n '{
    /ss: /N
    s/\n//
    s/IP address:/This computer ip address is/
    s/Computer name:/ and is under the name/p
}' file | tee newfile

(tee schreibt hilfreich in newfile und zeigt gleichzeitig die Ausgabe an)

6
Zanna

Es gibt wahrscheinlich ein Dutzend Möglichkeiten, dies mit verschiedenen Textverarbeitungsprogrammen (awk, Perl) und/oder Stream-Editoren (sed, ed) zu tun.

Eine Möglichkeit wäre, die Liste an den Doppelpunkttrennzeichen zu cut (-d:), wobei nur das zweite Feld (-f2) beibehalten wird, und dann xargs zu verwenden, um Zeilenpaare zu übergeben (-l2) als Argumente für printf:

$ cut -d: -f2 list.txt | xargs -l2 printf 'This computer ip address is %s and is under the name %s\n'
This computer ip address is 192.168.1.25 and is under the name computer7office
This computer ip address is 192.168.1.69 and is under the name computer22office
This computer ip address is 192.168.1.44 and is under the name computer12personal
6
steeldriver