On Fri, 21 Aug 2015 06:47:13 +0100 Edward Bartolo <[email protected]> wrote:
> Parsing headaches: > > I have this chunk of data retrieved from the backend which I need to > parse *reliably*. The goal is to read the SSID and the corresponsing > signal strength. > > How should I proceed. This part of code will be done from within > Lazarus. Please, be informed that Lazarus generated GUI uses GTK* as a > base. The executable can is also statically built which means an > increased portability. Executables are about 3 MB. In the past I have > written such applications that dwarf what I am doing and still the > size is small. > > Here is what I want to parse: > > root@edbarx-pc:/home/edbarx# iwlist wlan0 scan | grep -B 4 ESSID > > <<<<<<<<< > Channel:1 > Frequency:2.412 GHz (Channel 1) > Quality=70/70 Signal level=-34 dBm > Encryption key:on > ESSID:"EB-TP-LNK67" > -- > Channel:6 > Frequency:2.437 GHz (Channel 6) > Quality=24/70 Signal level=-86 dBm > Encryption key:on > ESSID:"TNCAPA0332D" > -- > Channel:11 > Frequency:2.462 GHz (Channel 11) > Quality=30/70 Signal level=-80 dBm > Encryption key:on > ESSID:"Home WiFi" > >>>>>>>>>>>>>>> :-) Hi Edward, At this point you're a lot more knowledgeable on this situation than I, but I'll give you an opinion. If this problem were any more complex, I'd suggest spawning awk, but it looks to me like as long as you can get these lines into Lazarus, I think you're golden. Please refer to http://dpaste.com/0FZE769 ... First thing: By using grep -B, you're throwing away some information you need: Specifically, encryption type. I'd recommend you pull *all* the output from iwscan $device scanning into a Turbo Pascal (you know what I mean) file linked into your Lazarus program, except "^\s+IE: Unknown". It's pretty easy to parse: * Throw away anything beginning with "^\s*IE: Unknown" * Throw away ^$device\s+Scan completed * Every ^\s*Cell \d starts a new record, record the cell number Every line is one of the following: 1. ^$device\s+Scan Completed 2. ^\s+Cell 3. ^\s+IE: Unknown 4. ^\s+\S.*: 5. ^\s+\S.*= 6. Everything else #3 can be avoided by having your original command be the following: root@edbarx-pc:/home/edbarx# iwlist wlan0 scan | grep -v "^\s+IE: Unknown:" #4 are the key/value pairs comprising most of what you need #6 are all additional information appended to the #4 item preceding them. So you need a somewhat stateful algorithm. You may or may not need a Group Cipher, Pairwise Ciphers, and/or Authentication Suites. If you don't need those three things, I think you can throw away all #6. #2 separates records #5 is the signal quality/level line. Give it its own subroutine. #1 gets thrown out Anyway, you definitely need to capture the encryption type, and by using your grep -B4 ESSID you're throwing that away. NetworkManager and Wicd both show encryption type on the ESSID list, and when I use either of this, I want to know which ones are WPA as opposed to (eeeuuu) WEP and which are (be very careful) unencrypted. HTH, Steve Steve Litt August 2015 featured book: Troubleshooting: Just the Facts http://www.troubleshooters.com/tjust _______________________________________________ Dng mailing list [email protected] https://mailinglists.dyne.org/cgi-bin/mailman/listinfo/dng
