GeekzeugLinux im GriffWindows

Bash: Letzten Befehl mit anderen Argumenten wiederholen

Hier wird wieder Tipparbeit gespart: Längere Befehle könnt Ihr ganz fix angepasst wiederverwerten.

Auf der Kommandozeile führt man häufig Befehle wieder und wieder mit kleinen Anpassungen durch - bis das Ergebnis passt. Oder nutzt einen Befehl mehrmals nacheinander mit unterschiedlichen Argumenten. Für die meisten heißt das vermutlich: Mit den Pfeiltasten herumnavigieren, mit ENTF löschen und neu schreiben - das ist aber zu kompliziert.

Simples Beispiel

Ein ganz einfaches Beispiel: Ihr pingt eine Seite (google.de) an und lasst das Ergebnis in eine Datei (tmp_ping_google) schreiben:

ping -c1 google.de > tmp_ping_google

Wenn Ihr das nun auch für Tutonaut.de machen wollt, heißt das: Befehl per Pfeiltaste-Rauf aufrufen, die beiden google-Instanzen löschen und durch tutonaut ersetzen und dann erneut ausführen. Selbst bei einem so kurzem Befehl mit nur zwei google-Vorkommen ist das schon lästig. Bei längeren Pipes ...

Hier hilft das kleine Bash-eigene Tool fc, mit dem sich Befehle aus der History bearbeiten oder modifiziert aufrufen lassen. Mit einem von der fc-Manpage inspiriertem Alias kann ich für Tutonaut.de nun einfach folgendes machen:

redo google=tutonaut

Was natürlich den Befehl

ping -c1 tutonaut.de > tmp_ping_tutonaut

ausführt. Hinter redo steckt ein simpler Alias:

alias redo='fc -s'

Die manpage schlägt schlicht "r" vor, redo scheint mir aber besser zu merken. Wenn Ihr nach dem ersten Ping-Befehl noch weitere Nicht-Ping-Befehle genutzt habt,könnt Ihr auch explizit den letzten Ping-Befehl modifizieren oder einen Befehl über die History-Nummer ansprechen:

redo google=tutonaut ping
redo google=tutonaut 1481

fc ersetzt alle Vorkommen eines Worts - oft genügt aber auch nur ein Vorkommen: das Erste!

Bonus: Befehle tauschen

Auch der umgekehrte Fall ist nicht unüblich: Ihr lasst die Argumente wie sie sind, nutzt aber einen anderen Befehl. Vielleicht guckt Ihr zunächst in ein Verzeichnis, um dann gegebenenfalls dorthin zu wechseln, also:

ls /etc/NetworkManager/conf.d/
cd /etc/NetworkManager/conf.d/

In solchen Fällen ist es noch einfacher - das erste Vorkommen eines Worts tauscht Ihr per:

^ls^cd

Da kann man sich wirklich dran gewöhnen!

Mirco Lang

Freier Journalist, Exil-Sauerländer, (ziemlich alter) Skateboarder, Dipl.-Inf.-Wirt, Einzelhandelskaufmann, Open-Source-Nerd, Checkmk-Handbuchschreiber. Ex-Saturn'ler, Ex-Data-Becker'ler, Ex-BSI'ler. Computer-Erstkontakt: ca. 1982 - der C64 des großen Bruders eines Freunds. Wenn Ihr hier mehr über Open Source, Linux und Bastelkram lesen und Tutonaut unterstützen möchtet: Über Kaffeesponsoring via Paypal.freue ich mich immer. Schon mal im Voraus: Danke! Nicht verpassen: cli.help und VoltAmpereWatt.de. Neu: Mastodon

5 Kommentare

  1. Moin, hab mal eine frage, gibt es auch eine möglichkeit wie unter windows wie bei mrt oder pingplotter unter tracerout zu Speicher zweck ist das meine Leitung über den ganzen tag geprüft wird ob wir Packet loss und wie sich der ping verändert. Laufen lassen würde ich dieses gerne auf einem raspberry pi 3 b.

      1. Winmtr meinte ich sorry. Danke für den Tipp aber leider suche ich eine Möglichkeit dieses unter den raspberry pi sprich raspbian Lite laufen zu lassen. Gibt es eine Möglichkeit ein Befehl für Kommandozeile das dieser ein traceroute macht und die einzelnen hops in eine Datei speichert? Ich möchte dieses den ganzen tag automatisch laufen lassen um zu checken wann und wo ich Packetloos bekomme damit ich die datei mein Provider zur Verfügung stellen kann.

      2. Tools wie Wireshark oder auch collectl könnten vielleicht entsprechende Funktionen liefern. Vielleicht genügt ein simples Ping?

        ping -c 3 tutonaut.de | grep "packet loss" | awk -F ',' '{print $3}'
        

        Das würde Tutonaut.de 3 mal anpingen, die Zusammenfassung über das grep-Kommando filtern und per awk auf die Packet-Loss-Information beschränken – kann man natürlich anpassen. Das könnte man dann in ein Skript packen und kontinuierlich ausführen und in eine Datei schreiben lassen, etwa:

        while true; do
        ping -c 3 tutonaut.de | grep "packet loss" | awk -F ',' '{print $3}' >> meine-ping-log-datei
        sleep 60
        done
        

        Da könnte man jetzt noch mit rumspielen und zum Beispiel weitere Seiten einfügen. Wenn es nicht um bestimmte Seiten geht, sondern um alle Verluste über den Tag, könnte collectl besser geeignet sein. Ob das für Deine Zwecke passt, müsstest Du ausprobieren – ganz trivial ist collectl auf den ersten Blick nicht.

        Nachtrag: ss und netstat könnten auch helfen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Schaltfläche "Zurück zum Anfang"