Xianlin
Xianlin

Reputation: 1189

sed or awk extract values from output file column string pattern

I have a file as the below:

  Cell 01 - Address: 58:6D:8F:D1:A9:07                    Quality=52/70  Signal level=-58 dBm                      Encryption key:on                    ESSID:"money-plant"                    Extra: Last beacon: 80ms ago
  Cell 02 - Address: 10:C3:7B:55:73:38                    Quality=45/70  Signal level=-65 dBm                      Encryption key:on                    ESSID:"JDBX"                    Extra: Last beacon: 80ms ago
  Cell 03 - Address: 64:09:80:5F:7D:AF                    Quality=61/70  Signal level=-49 dBm                      Encryption key:on                    ESSID:"NExT"                    Extra: Last beacon: 80ms ago
  Cell 04 - Address: 64:66:B3:9D:82:76                    Quality=49/70  Signal level=-61 dBm                      Encryption key:on                    ESSID:"home-router"                    Extra: Last beacon: 80ms ago
  Cell 05 - Address: 08:86:3B:30:88:6C                    Quality=42/70  Signal level=-68 dBm                      Encryption key:on                    ESSID:"SoundEyeWifi"                    Extra: Last beacon: 80ms ago
  Cell 06 - Address: 00:0B:81:9A:5F:37                    Quality=33/70  Signal level=-77 dBm                      Encryption key:on                    ESSID:"IROAD_AEV_9A5F37"                    Extra: Last beacon: 80ms ago
  Cell 07 - Address: 74:A2:E6:CF:94:D0                    Quality=48/70  Signal level=-62 dBm                      Encryption key:on                    ESSID:"NUS"                    Extra: Last beacon: 80ms ago
  Cell 08 - Address: AC:F1:DF:26:FD:E4                    Quality=39/70  Signal level=-71 dBm                      Encryption key:on                    ESSID:"iNote"                    Extra: Last beacon: 80ms ago
  Cell 09 - Address: 74:A2:E6:CF:94:D1                    Quality=52/70  Signal level=-58 dBm                      Encryption key:on                    ESSID:"eduroam"                    Extra: Last beacon: 80ms ago
  Cell 10 - Address: 74:A2:E6:CF:94:D3                    Quality=51/70  Signal level=-59 dBm                      Encryption key:on                    ESSID:"\x00"                    Extra: Last beacon: 80ms ago
  Cell 11 - Address: 74:A2:E6:CF:94:D5                    Quality=49/70  Signal level=-61 dBm                      Encryption key:on                    ESSID:"\x00"                    Extra: Last beacon: 80ms ago
  Cell 12 - Address: 74:A2:E6:CF:94:D8                    Quality=50/70  Signal level=-60 dBm                      Encryption key:on                    ESSID:"\x00"                    Extra: Last beacon: 80ms ago

By using sed or awk or whatever, I want the below output:

58:6D:8F:D1:A9:07 -58 money-plant 80ms
10:C3:7B:55:73:38 -65 JDBX 80ms
64:09:80:5F:7D:AF -78 Next 80ms
64:66:B3:9D:82:76 -71 home-router 80ms
...

how to achieve that?

Upvotes: 0

Views: 365

Answers (5)

Sundeep
Sundeep

Reputation: 23707

With grep and pcre

$ grep -oP 'Address: \K\S+|Signal level=\K\S+|ESSID:"\K[^"]+|\d+ms' ip.txt | pr -4 -ats' '
58:6D:8F:D1:A9:07 -58 money-plant 80ms
10:C3:7B:55:73:38 -65 JDBX 80ms
64:09:80:5F:7D:AF -49 NExT 80ms
64:66:B3:9D:82:76 -61 home-router 80ms
08:86:3B:30:88:6C -68 SoundEyeWifi 80ms
00:0B:81:9A:5F:37 -77 IROAD_AEV_9A5F37 80ms
74:A2:E6:CF:94:D0 -62 NUS 80ms
AC:F1:DF:26:FD:E4 -71 iNote 80ms
74:A2:E6:CF:94:D1 -58 eduroam 80ms
74:A2:E6:CF:94:D3 -59 \x00 80ms
74:A2:E6:CF:94:D5 -61 \x00 80ms
74:A2:E6:CF:94:D8 -60 \x00 80ms
  • Uses positive lookbehind to prune matching strings

To style it neatly, leave out the separator (doesn't show here, but columns line up)

$ grep -oP 'Address: \K\S+|Signal level=\K\S+|ESSID:"\K[^"]+|\d+ms' ip.txt | pr -4 -at
58:6D:8F:D1:A9:07 -58           money-plant       80ms
10:C3:7B:55:73:38 -65           JDBX          80ms
64:09:80:5F:7D:AF -49           NExT          80ms
...

Upvotes: 1

Inian
Inian

Reputation: 85895

Using GNU awk and its very own fancy printf from String-Manipulation Functions and substr, it can be done as

awk '{split($8, a, "level=");b=substr($12,7);gsub(/"/,"",b);printf "%-16s %s %-16s %-16s\n", $5, a[2], b, $16}' file

Produces a fancy output format as expected.

58:6D:8F:D1:A9:07 -58 money-plant      80ms
10:C3:7B:55:73:38 -65 JDBX             80ms
64:09:80:5F:7D:AF -49 NExT             80ms
64:66:B3:9D:82:76 -61 home-router      80ms
08:86:3B:30:88:6C -68 SoundEyeWifi     80ms
00:0B:81:9A:5F:37 -77 IROAD_AEV_9A5F37 80ms
74:A2:E6:CF:94:D0 -62 NUS              80ms
AC:F1:DF:26:FD:E4 -71 iNote            80ms
74:A2:E6:CF:94:D1 -58 eduroam          80ms
74:A2:E6:CF:94:D3 -59 \x00             80ms
74:A2:E6:CF:94:D5 -61 \x00             80ms
74:A2:E6:CF:94:D8 -60 \x00             80ms

Upvotes: 1

Aguevara
Aguevara

Reputation: 91

With Sed since everyone wants to use awk. I am using grouping:

sed 's/\(^.*Address: \)\([A-Z0-9:]*\)\( .*level=\)\(\-[0-9]*\)\( .*ESSID:\"\)\(.*\)\(\".*beacon: \)\(.*\)\( ago.*\)/\2 \4 \6 \8/g' tmp

OUTPUT:

58:6D:8F:D1:A9:07 -58 money-plant 80ms
10:C3:7B:55:73:38 -65 JDBX 80ms
64:09:80:5F:7D:AF -49 NExT 80ms
64:66:B3:9D:82:76 -61 home-router 80ms
08:86:3B:30:88:6C -68 SoundEyeWifi 80ms
00:0B:81:9A:5F:37 -77 IROAD_AEV_9A5F37 80ms
74:A2:E6:CF:94:D0 -62 NUS 80ms
AC:F1:DF:26:FD:E4 -71 iNote 80ms
74:A2:E6:CF:94:D1 -58 eduroam 80ms
74:A2:E6:CF:94:D3 -59 \x00 80ms
74:A2:E6:CF:94:D5 -61 \x00 80ms
74:A2:E6:CF:94:D8 -60 \x00 80ms

Upvotes: 0

Ed Morton
Ed Morton

Reputation: 204648

$ awk -F'[ "=]+' '{print $6, $11, $16, $20}' file
58:6D:8F:D1:A9:07 -58 money-plant 80ms
10:C3:7B:55:73:38 -65 JDBX 80ms
64:09:80:5F:7D:AF -49 NExT 80ms
64:66:B3:9D:82:76 -61 home-router 80ms
08:86:3B:30:88:6C -68 SoundEyeWifi 80ms
00:0B:81:9A:5F:37 -77 IROAD_AEV_9A5F37 80ms
74:A2:E6:CF:94:D0 -62 NUS 80ms
AC:F1:DF:26:FD:E4 -71 iNote 80ms
74:A2:E6:CF:94:D1 -58 eduroam 80ms
74:A2:E6:CF:94:D3 -59 \x00 80ms
74:A2:E6:CF:94:D5 -61 \x00 80ms
74:A2:E6:CF:94:D8 -60 \x00 80ms

Upvotes: 3

twentyonemore
twentyonemore

Reputation: 29

cat input_list_file | awk '{print $5,$8,$12,$16}' | sed 's/level=//g' | sed 's/ESSID://g' | sed 's/"//g'

Upvotes: 1

Related Questions