PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : grep und awk



emwe
13.04.02, 18:37
Hallo,

die beiden Befehle gehören wohl zu den Klassikern der *nix-Tools. Und man kann schöne Pipes damit bauen:


ifconfig eth0 | grep "inet addr:" | awk '{ print $2 }' | awk -F ':' '{ print $2 }'


Dieses Beispiel holt aus der 'ifconfig'-Ausgabe die IP-Adresse und gibt sie aus.
Weitere Beispiele erwünscht, vielleicht mal was mit sed?

Spass damit,

emwe

geronet
13.04.02, 19:22
Ja klar, hier bitte:





Zum Beispiel aus dem Startscript von meinem Diskless Cluster:




IP=`/sbin/ifconfig eth0 | awk '/inet/ { print $2 } ' | sed -e s/addr://`

if [ "$IP" != "" ]; then

echo "Starting services for diskless workstation:"



# get hostname

HOSTNAME=`/usr/bin/nslookup $IP | awk '/Name/ { print $2 } ' `



if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then

# get host-number

declare -i HOST_NUM=`echo $IP | sed -e s/[0-9]*.[0-9]*.[0-9]*.//`-10

HOSTNAME="Ace$HOST_NUM.Bachmaier"

fi

fs111
13.04.02, 20:24
Auf meiner Redhat 7.2 sieht das ganze folgendermaßen aus:



/sbin/ifconfig ppp0 | grep "inet Adr" | awk '{ print $2 }' | awk -F ':' '{ print $2 }'

und hier ein kleines Skript zum auslesen der online Zeit für Leute mir dsl ohne flat



#!/bin/bash


date | cut -c 5-7 |

read month &&


cat /var/log/messages |
grep "$month" |
grep "Connect time"

Grüße fs111

lankin
16.04.02, 19:30
hai zusammen.

bitte versteht meine folgenden worte als kleinen
tip am rande und nicht als kritik.

> ifconfig eth0 | grep "inet addr:" | awk '{ print $2 }' | awk -F ':' '{ print $2 }'

nun es brennt mir halt doch immer wieder in den
augen, wenn ich diese oder ähnliche "grep"/"awk"-verschachtelungen sehe.

in diesem fall ist z.b. der grep überflüssig. denn
awk '/inet addr:/ { print $2 }'
erledigt den gleichen job mit nur einem
kommando und lässt so ein mächites tools wie
"awk" nicht nur auf die kleinsten aller spatzen
schiessen *g*

wenn schon viel verschachteln, dann ist "cut" sicher
die schnellere wahl, gerade wenn die eingabe sehr
gross wäre.

natürlich ist unter gewissen umständen auch aus
geschwindigkeitsgründen der "grep" einem "awk"
vorzuziehen. bei diesen fällen bin ich aber meistens
direkt beim "C"-prommieren gelandet.

es gibt natürlich noch einige möglichkeiten den
2. awk einzusparen, aber ich denke ich hab
jetzt doch schon genug klug*******erei
abgesondert ;)

viele gruesse
lankin

rtulke
15.09.04, 15:02
dein stück script ist leider nicht viel besser :


atmk:/etc/bind# ifconfig | awk '/inet addr: / { print $2 }'
addr:193.201.54.108
addr:193.201.54.188
addr:193.201.54.189
addr:193.201.54.190

es sollte so ausschauen (mit sed):


atmk:/etc/bind# ifconfig | awk '/inet addr:/ { print $2 }' |sed 's/.*://';
193.201.54.108
193.201.54.188
193.201.54.189
193.201.54.190
127.0.0.1

aber viele Wege führen nach Rom.

Ein paar andere Bsp. aus meinem alltäglichen gebrauch:

Netstat übersicht tabellarisch


netstat -aep --numeric-hosts --numeric-ports | egrep '(ESTABLISHED|LISTEN)' | sed 's/:\([0-9\*]*\) / \1 /g;s/\// /g' | awk '{print $8 " ip: " $4 "\tto_ip: " $6 "\tport: " $5 "\tuser: " $9 "\tname: " $12 "\tpid: " $11}'

linuxhanz
16.09.04, 21:05
hier ein Beispiel fuer eine Verhaspelung *g*
Eigentlich sollte hier ein sed Befehl stehen der in einem Abwasch alle Devices
nach IP Adressen scannt. Ist zwar gegen die Unix Philosophie . (von wegen Pipes usw.)
grrr, ausserdem wollte ich keine Statischen Elemente mehr drin haben:



ifconfig | sed -e '1,$s/inet addr://' -e 's/[0-9]\{0,3\}\.[0-9]\{0,3\}\.[0-9]\{0,3\}\.[0-9]\{0,3\} ://' -e 's/[\t ]//g' -e 's/[a-z,A-Z]//g' -e 's/1^[^:0*]//g' -e 's/[:]//g' -e 's/255*//g' -e 's/(*)*//g' -e 's/^0*.0//g'



todo: vereinfachen mit oderverknüpfungen
genau 4 aber nicht mehr zahlen