grep :начать совпадающую строку с заданной позиции (пропустить первые n символов)

#!/bin/bash
#again you must use bash... 
valid[0]=160650648 ; valid[1]=163686025
valid[2]=120806542 ; valid[3]=37206841
i=0

while sleep 5;  do
    scan=$(./RFSniffer)
    if [ "$scan" == "$oldscan" ]; then
    i=$((i+1))
    #if i is minor than 10 restart loop...
    #So a alert will not be displayed again after 50 seconds...
        if [ "$i" -lt "10" ]; then
            continue
        else 
            i=0
        fi
    fi

    case $scan in 
           ${valid[0]})
               echo "Good Read"
               echo "Your code is " $scan
              ./buzzer.sh &
               omxplayer -o local sleighbells.mp3
               curl -u "code": https://api.pushbullet.com/v2/pushes -d type=note -d title="Alert" -d body="DoorBell" &
            ;; 
            ${valid[1]})
                curl -u "code": https://api.pushbullet.com/v2/pushes -d type=note -d title="Alert" -d body="front sensor" &
            ;;
            ${valid[2]})
                curl -u "code": https://api.pushbullet.com/v2/pushes -d type=note -d title="Alert" -d body="Back door sensor" &
            ;;
            ${valid[3]})
                curl -u "code": https://api.pushbullet.com/v2/pushes -d type=note -d title="Alert" -d body="Second sensor" &
            ;;
            *)
               echo "BAD READ:  your code and the valid don't match"
               echo "Your correct valid code should be " $scan
            ;;
    esac

    oldscan=$scan
    scan=''
    #sleep 5 not needed sleep 5 is in while condition 

done

РЕДАКТИРОВАТЬ :см. комментарии..

0
26.01.2021, 06:45
3 ответа

Опция, использующая GNU grep, которая игнорирует первые 19 символов и соответствует только нужному шаблону:

grep -P "(?<=.{19})2" file

Выход:

2021-Jan-26 05:35  foo bar 2
2021-Jan-26 05:37  asdf 2 foo bar
2
18.03.2021, 22:34

Вы должны сначала использовать cut, чтобы игнорировать шаблон

Я предполагаю, что вывод записывается в файл cat filename |cut -c 19- |grep 2должен это сделать.

-1
18.03.2021, 22:34

На самом деле вы хотите сопоставить первые 19, но сопоставьте их с «чем угодно».

Итак,

grep '^....................*2' 

Всего 20 точек. ^привязывает шаблон к началу строки. Следующие 19 точек соответствуют одному символу каждая, фактически пропуская их. Затем идет .*, который соответствует нулю или более символам, затем идет 2, чтобы соответствовать нужному шаблону.

Вы можете сделать это потенциально более эффективным с помощью

grep '^..................[^2]*2'

соответствует началу строки, затем 19 символов, затем ноль или более символов, которые не являются 2, затем 2. В этом случае существенной разницы не будет, но если искомый паттерн более сложный, то эта оптимизация может сильно помочь.

2
18.03.2021, 22:34

Теги

Похожие вопросы