Kuinka käyttää regexiä kentän erottimena awk: ssä?

Yritän käyttää regexiä kentänerottimena ryhmässä awk. Lukemastani tämä näyttää mahdolliselta, mutta En voi saada syntaksia oikein.

rpm -qa | awk "{ "FS == [0-9]" ; print $1 }" awk: cmd. line:1: { FS awk: cmd. line:1: ^ unexpected newline or end of string 

Ajatuksia? Tavoitteena on saada luettelo ohjelmista ilman versionumeroa, ellei se ole huomaamaton.

Vastaa

Olet pilkkannut tarjouksesi ja syntaksisi. Syöttökentän erotin asetetaan helpoimmin tekemällä komentorivillä -F -vaihtoehto:

awk -F "[0-9]" "{ print $1 }" 

tai

awk -F "[[:digit:]]" "{ print $1 }" 

Tämä käyttää mitä tahansa numeroa syöttökentän erottimena ja antaa sitten ensimmäisen kentän kustakin rivistä.

Lausekkeet [0-9] ja [[:digit:]] eivät ole aivan samanlaisia, riippuen kielestäsi. Katso ” Ero [0-9], [[: digit:]] ja \ d ”.

Voidaan myös asettaa FS itse awk -ohjelmassa. Tämä tehdään yleensä BEGIN -lohkossa, kun se alustetaan kerran:

awk "BEGIN { FS = "[0-9]" } { print $1 }" 

Huomaa, että yksi lainausmerkkejä ei voi käyttää kuoren yhden lainauksen merkkijonossa, ja että awk merkkijonot käyttävät aina lainausmerkkejä.

Kommentit

  • Onko mahdollista käyttää FS: ää ja nähdä merkitsevä merkkijono?

Vastaa

+1 Kusalanandan vastaukselle. Vaihtoehtoisesti FS-muuttuja voidaan asettaa BEGIN-lauseessa:

awk "BEGIN {FS="[0-9]"} {print $1}" 

Toimintalohkon FS: n muuttaminen ei tule voimaan, ennen kuin seuraava rivi luetaan.

$ printf "%s\n" "abc123 def456" "ghi789 jkl0" | awk "{FS="[0-9]"; print $1}" abc123 ghi 

Muut kysymyksessä olevat virheet:

  • ei voi käyttää yksittäisiä lainausmerkkejä yhden lainauksen merkkijonossa
  • == on vertailuoperaattori, = on tarkoitettu muuttujan määritykseen

Kommentit

  • " Changi ng FS toimintalohkossa ' ei tule voimaan, kunnes seuraava rivi luetaan " I ' olen etsinyt tietoja kaikkialta.
  • plus: ei voi ' t käyttää yksittäisiä lainausmerkkejä merkkijonon arvolle awk-muodossa, vaikka välität ne shell oikein
  • Onko mahdollista käyttää FS: ää ja nähdä merkitsevä merkkijono?
  • FS on muuttuja, joten voit tehdä mitä tahansa mikä tahansa muu muuttuja (esim. print FS). Uskon, ettet voi saada osia, jotka sopivat FS: ään POSIX awk: n kanssa. GNU awk: lla voit kirjoittaa n = split($0, fields, FS, separators), jossa fields ja separators ovat taulukoita.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *