2016-09-30 78 views
0

我有一個文件作爲如下:SED或AWK提取值

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 

通過使用sedawk或什麼,我想在下面的輸出:

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 
... 

如何實現這一目標?

+0

什麼是你列之間的那些大的差距?他們是製表符還是特定數量的空白字符或其他內容? –

回答

3
$ 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 
+1

與以往一樣,你的答案會使其他人」業餘「_和_」愚蠢「_ +1 – Inian

+1

這是簡短和更好的答案+1024 – Xianlin

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

可縮寫爲'awk'{print $ 5,$ 8,$ 12,$ 16}'input_list_file | sed -E's/level = | ESSID:|「// g'' :) – Sundeep

+0

當你使用awk時,你永遠不需要sed,而當你使用任何東西時你永遠不需要cat(谷歌UUOC)。 「是一種反模式 –

1

隨着greppcre

$ 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 
  • 採用積極的回顧後修剪字符串匹配

整齊樣式它,離開了分離器(這裏不顯示,但列排隊)

$ 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 
... 
1

使用GNU awk和自己看中printfString-Manipulation Functionssubstr,這是可以做到的

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

隨着桑達,因爲每個人都希望用awk。我使用的分組:

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