Как искать строки с соседними повторяющимися цифрами

В дополнение к решению @ Michael Daffin вы также можете использовать инструмент daemonize , чтобы добиться использования forking, как показано в следующем примере.

Получив небольшой сценарий оболочки, который я хочу демонизировать и которым я хочу управлять через systemd, я сохранил его как/home/pi/testscript.sh:

#!/bin/bash

while true;
do
    sleep 1
    echo -n "."
done

Если у вас его еще нет, установите daemonize, например:

sudo apt install daemonize

Теперь создайте файл определения файловой службы:

sudo vi /etc/systemd/system/testomat.service
# It is not recommended to modify this file in-place, because it will
# be overwritten during package upgrades. If you want to add further
# options or overwrite existing ones then use
# $ systemctl edit testomat.service
# See "man systemd.service" for details.

# copied from https://github.com/bitcoin/bitcoin/blob/master/contrib/init/bitcoind.service and modified by Michael 

[Unit]
Description=Test service
After=network.target

[Service]
ExecStart=daemonize -p /run/testomat/testomat.pid -o /home/pi/testscript.log /home/pi/testscript.sh
TimeoutSec=1200

# Make sure the config directory is readable by the service user
PermissionsStartOnly=true

# Process management
####################
Type=forking
PIDFile=/run/testomat/testomat.pid
Restart=on-failure
GuessMainPID = true

# Directory creation and permissions
####################################

# Run as pi:pi
User=pi
Group=pi

# /run/testomat
RuntimeDirectory=testomat
RuntimeDirectoryMode=0710

# /var/lib/testomat
StateDirectory=testomat
StateDirectoryMode=0710

# Hardening measures
####################

# Provide a private /tmp and /var/tmp.
PrivateTmp=true

# Mount /usr, /boot/ and /etc read-only for the process.
ProtectSystem=full

# Allow access to /home, /root and /run/user
# Chosing "false" is actually no hardening, this is just to demonstrate the usage of a service. Well, I could have omitted it. True. :)
ProtectHome=false

# Disallow the process and all of its children to gain
# new privileges through execve().
NoNewPrivileges=true

# Use a new /dev namespace only populated with API pseudo devices
# such as /dev/null, /dev/zero and /dev/random.
PrivateDevices=true

# Deny the creation of writable and executable memory mappings.
MemoryDenyWriteExecute=true

[Install]
WantedBy=multi-user.target

Вновь созданный сервис должен быть объявлен в systemd:

systemctl daemon-reload

Теперь вы можете запустить службу, и скрипт разветвится. Как и ожидалось, запуск службы немедленно возвращается в оболочку. Результат очевиден:

$ tail -f testscript.log 
.....................

0
27.10.2020, 18:52
3 ответа

Следующая awkпрограмма должна работать:

awk '{buf=gensub(/ */,"","g",$0); split(buf,chars,""); last=chars[1];
      for (i=2;i<=length(buf);i++) {if (chars[i]==last) {print; next}; last=chars[i]}}' test.txt

Это сначала удалит все пробелы из строки ввода и сохранит результат в строке buf. Затем он разделит bufна массив отдельных символов chars. Это будет проанализировано, чтобы увидеть, найдены ли последовательные символы. Если это так, строка печатается.

(Это решение не использует обратные ссылки RegEx)

0
18.03.2021, 22:54

Это возможно с GNU grep, если я правильно понимаю:

grep -P "([0-9])[[:blank:]]?\1" file

Выход:

1234 2271 4423
8901 1234 2569
1134 7896 6780
0
18.03.2021, 22:54

Хотя это не так интересно, как использование обратных ссылок и квантификатора вопросительного знака, вы можете сделать это, используя конвейеры и простое регулярное выражение, с тем преимуществом, что его легче понять IMHO.

tr -d ' ' | egrep '00|11|22|33|44|55|66|77|88|99' | sed -r 's/..../& /g'

Или вы можете сделать все это в sed, но это менее читабельно:

sed -r 's/ //g;/00|11|22|33|44|55|66|77|88|99/!d;s/..../& /g'

Основная концепция обоих из них состоит в том, чтобы удалить пробел между числами, использовать простое регулярное выражение для сопоставления строк с соседними числами, а затем вернуть пробел, чтобы распечатать его.

0
18.03.2021, 22:54

Теги

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