Разбор чисел из строки - BASH скрипт - PullRequest
1 голос
/ 16 марта 2011

У меня есть текстовый файл со следующим содержимым:

QAM Mode : QAM-16  
QAM Annex : Annex A  
Frequency : 0 Hz  
IF Frequency : 0 Hz  
Fast Acquisition  : 0  
Receiver Mode  : cable  
QAM Lock : 1  
FEC Lock : 1  
Output PLL Lock : 0  
Spectrum Inverted : 0  
Symbol Rate : -1  
Symbol Rate Error : 0  
IF AGC Level (in units of 1/10 percent) : 260  
Tuner AGC Level (in units of 1/10 percent) : 1000  
Internal AGC Level (in units of 1/10 percent) : 0  
SNR Estimate (in 1/100 dB) : 2260  
**FEC Corrected Block Count (Since last tune or reset) : 36472114  
FEC Uncorrected Block Count (Since last tune or reset) : 0  
FEC Clean Block Count (Since last tune or reset) : 0**  
Cumulative Reacquisition Count : 0  
Uncorrected Error Bits Output From Viterbi (Since last tune or reset) : 0  
Total Number Of Bits Output from Viterbi (Since last tune or reset) : 0  
viterbi bit error rate (in 1/2147483648 th units) : 0  
Carrier Frequency Offset (in 1/1000 Hz) : -2668000  
Carrier Phase Offset (in 1/1000 Hz) : 0  
**Good Block Count (Reset on read) : -91366870**  
**BER Raw Count (Reset on read) : 0**  
DS Channel Power (in 10's of dBmV units ) : -760  
Channel Main Tap Coefficient : 11846  
Channel Equalizer Gain Value in dBm : 9  
**Post Rs BER : 2147483648  
Post Rs BER Elapsed Time (in Seconds) : 0**  
Interleave Depth : 1  

Мне нужно проанализировать числа из жирных строк, используя скрипт bash, но я не смог сделать это с помощью набора командУ меня есть в наличии.Это мой первый раз, когда я использую скрипты BASH и поиски, которые я обнаружил, которые могли бы помочь, использовали некоторые опции grep, sed и cut, которые были недоступны.Опции, которые у меня есть, перечислены ниже:

grep

Usage: grep [-ihHnqvs] PATTERN [FILEs...]  
Search for PATTERN in each FILE or standard input.  
Options:  
        -H      prefix output lines with filename where match was found  
        -h      suppress the prefixing filename on output  
        -i      ignore case distinctions  
        -l      list names of files that match  
        -n      print line number with output lines  
        -q      be quiet. Returns 0 if result was found, 1 otherwise  
        -v      select non-matching lines  
        -s      suppress file open/read error messages  

sed

BusyBox v1.00-rc3 (00:00) multi-call binary  
Usage: sed [-efinr] pattern [files...]  
Options:  
        -e script       add the script to the commands to be executed  
        -f scriptfile   add script-file contents to the  
                        commands to be executed  
        -i              edit files in-place  
        -n              suppress automatic printing of pattern space  
        -r              use extended regular expression syntax  
If no -e or -f is given, the first non-option argument is taken as the sed  
script to interpret. All remaining arguments are names of input files; if no  
input files are specified, then the standard input is read.  Source files  
will not be modified unless -i option is given.  

awk

BusyBox v1.00-rc3 (00:00) multi-call binary  
Usage: awk [OPTION]... [program-text] [FILE ...]  
Options:  
        -v var=val              assign value 'val' to variable 'var'  
        -F sep                  use 'sep' as field separator  
        -f progname             read program source from file 'progname'  

Может кто-нибудь, пожалуйста, помогите мне сэтот?Спасибо!

Ответы [ 4 ]

4 голосов
/ 16 марта 2011

AWK может сделать это для вас:

awk '/^(FEC.*Block|Good Block|BER|Post)/{print $NF}' textfile
0 голосов
/ 22 сентября 2013

Кроме того, вы можете сделать это с помощью однострочного чистого bash, без awk, sed, grep или других помощников:

$  { while read line; do if [[ $line =~ "Post Rs BER : (.*)$" ]]; then echo ${BASH_REMATCH[1]}; fi; done; } < data.txt 
2147483648
$

или

$ cat data.txt | { while read line; do if [[ $line =~ "Post Rs BER : (.*)$" ]]; then echo ${BASH_REMATCH[1]}; fi; done; }
2147483648
$ 
0 голосов
/ 21 сентября 2013

Если у вас есть правильный grep, вы можете сделать это только с помощью grep, используя упреждающий просмотр регулярных выражений:

$ /bin/grep -Po "(?<=Post Rs BER : )(.+)" data.txt 
2147483648
$

Я получил вдохновение для этого здесь

0 голосов
/ 16 марта 2011
grep -e "^FEC " -e "^Good Block" -e "BER" file.txt | awk '{print $NF}'

grep: Сопоставить строки, которые: начинаются с FEC или , начинаются с Good Block или , содержат BER

awk: Распечататьпоследнее разделенное пробелами поле в каждой строке

...