awk - wat doe ik hier fout

Pagina: 1
Acties:

  • blorf
  • Registratie: December 2003
  • Laatst online: 25-12-2025
Ik probeer uit de uitvoer van ifconfig het laatste cijfer van het mac-adres te pakken te krijgen met awk.
(FreeBSD 6.2)

De uitvoer van ifconfig:

re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=1b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING>
inet 192.168.1.81 netmask 0xffffff00 broadcast 192.168.1.255
ether 00:00:00:00:00:01
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
plip0: flags=108810<POINTOPOINT,SIMPLEX,MULTICAST,NEEDSGIANT> mtu 1500
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
inet6 ::1 prefixlen 128
inet 127.0.0.1 netmask 0xff000000

mijn bash-scriptje:

#!/usr/local/bin/bash
A=` ifconfig | grep ether `
B=` echo $A | awk '{ FS = "" } { print $23 } ' `
echo $A
echo $B

De uitvoer daarvan:
ether 00:00:00:00:00:01
<--- lege regel

Als ik de man page van awk begrijp zorgt {FS = ""} ervoor dat alle invoerregels worden opgedeeld in de losse letters $1 t/m in dit geval $23 maar op de een of andere manier begrijpt hij dat niet.

edit: excuses, ik zie nu dat dit topic waarschijnlijk bij NOS hoort.

[ Voor 3% gewijzigd door blorf op 25-08-2007 00:35 ]

You are in a maze of little twisting passages, all different.


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 19:28

Creepy

Tactical Espionage Splatterer

Als je de grep ether toch al hebt waarom gebruik je dan geen cut met een : als seperator?

En meteen een move naar NOS idd.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Scheelt 't als je:
code:
1
B=` echo $A | awk 'FS = "";  print $23; ' `

gebruikt?
Niet getest, want ik heb al een paar jaar geen Linux meer, en m'n AWK kennis is ook wat roestig, maar 't staat me bij dat alles wat je binnen curly brackets definieert alleen binnen die curly brackets gelden. Bij het print commando is FS daarom weer de default spatie.

  • Sprite_tm
  • Registratie: September 2002
  • Laatst online: 30-01 01:49

Sprite_tm

Semi-Chinees

code:
1
ifconfig | grep ether | cut -d ':' -f 6

should do the trick, zoals Creepy al zei.

Relaxen und watchen das blinkenlichten. | Laatste project: Ikea Frekvens oog


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:52
Om je concrete vraag te beantwoorden: je moet FS van te voren instellen, want die wordt al gelijk bij het parsen van de eerste regel gebruikt. Bijvoorbeeld zo dus:
awk -v FS="" { print $23 }'


Verder zou ik inderdaad ook een ander tooltje gebruiken. Als je het laatste cijfer van de regel wil kun je ook iets met sed ofzo doen:
sed -E 's/.*(.)/\1/'

Iets minder obscuur omdat je niet de positie van het laatste karakter in de regel hardcode.

edit:
Sprite_tm schreef op zaterdag 25 augustus 2007 @ 00:56:
code:
1
ifconfig | grep ether | cut -d ':' -f 6

should do the trick, zoals Creepy al zei.
Net als toen Creepy het zei, geeft dat niet het laatste cijfer van het adres, maar de laatste twee. ;) Kun je er nog wel een cut -c 2 achter zetten natuurlijk.

[ Voor 30% gewijzigd door Soultaker op 25-08-2007 01:08 ]


  • blorf
  • Registratie: December 2003
  • Laatst online: 25-12-2025
Ok, bedankt, hier heb ik wat aan. Die cut variant is ook een handige, eigenlijk beter.

You are in a maze of little twisting passages, all different.


  • sam.vimes
  • Registratie: Januari 2007
  • Laatst online: 07-01 22:10
blorf schreef op zaterdag 25 augustus 2007 @ 00:13:
[...]
mijn bash-scriptje:

#!/usr/local/bin/bash
A=` ifconfig | grep ether `
B=` echo $A | awk '{ FS = "" } { print $23 } ' `
echo $A
echo $B

[...]
Wat mij vaak opvalt is dat er vaak (niet alleen in dit geval) een pipeline met zowel grep als awk wordt gebruikt, terwijl awk ook op reguliere expressies kan zoeken:
code:
1
2
3
#!/bin/bash
B=$( ifconfig | awk -F: '/^ether/{print $NF}' )
echo $B

drukt het laatste veld (bij opsplitsen op ":") van de regel die met "ether" begint af. Scheelt een grep.
Voor alleen het laatste char kun je de awk-functie substr gebruiken:
code:
1
2
3
#!/bin/bash
B=$( ifconfig | awk '/^eth/{print substr($0, length, 1) }' )
echo $B

(NB: substr in awk begint te tellen bij index 1.)

Alleen bljikt op mijn machine dat laatste character een spatie te zijn, terwijl het natuurlijk om de laatste niet-spatie gaat. Daarom gebruik ik meestal Perl met zijn krachtige reguliere expressies:
code:
1
2
3
4
#!/bin/bash
# pak laatste niet-spatie:
B=$( ifconfig | perl -wlne '/^eth.*(\S)\s*$/ and print $1' )
echo $B
Pagina: 1