Один может написать сценарии ван Смуренбурга rc
, которые делают это. Они заканчиваются конструкцией case
… esac
для каждого отдельного шага в сценарии. Это невозможно поддерживать.
Это одна из известных проблем с этим механизмом.
Добавьте к этому тот факт, что скрипты ван Смуренбурга rc
не использовались в Ubuntu и Fedora в течение многих лет. В обоих случаях до systemd у них был Upstart. Кроме того, в Arch Linux отключена совместимость с van Smoorenburg rc
в systemd. Думать, что сценарий ван Смуренбурга rc
является неким универсальным минимумом, который каждый может запустить , даже игнорируя варианты вспомогательных команд , — это откровенная ошибка. Вы стремитесь к неправильной цели.
Чтобы получить хотя бы представление о значительных различиях, которые необходимо учитывать при написании одного сценария для всех разновидностей, учтите, что с 2014 года способ написания сценариев ван Смуренбурга rc
в Debian теперь задокументирован следующим образом:
#!/lib/init/init-d-script ## BEGIN INIT INFO # Provides: myvpn # Required-Start: $network $local_fs $remote_fs # Required-Stop: $network $local_fs $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: MY VPN service # Description: This script starts the MY VPN Daemon ### END INIT INFO DAEMON=/opt/myvpn/bin/myvpn-daemon NAME=myvpn export LD_LIBRARY_PATH=/opt/myvpn/lib
Поскольку он намного короче вашего сценария, здесь есть место для дополнительного контента. Берем грубый сервисный блок systemd…
% cat myvpn.service [Unit] Description=My VPN service [Service] ExecStart=/opt/myvpn/bin/myvpn-daemon Environment=LD_LIBRARY_PATH=/opt/myvpn/lib Restart=always [Install] WantedBy=multi-user.target %
… и преобразовать его …
% system-control convert-systemd-units --no-generation-comment./myvpn.service %
… показано, как будет выглядеть определение семейного сервиса daemontools -(в этом случае с использованием набора инструментов nosh ):
% system-control print-service-scripts./myvpn start:#!/bin/nosh start:true stop:#!/bin/nosh stop:true run:#!/bin/nosh run:#My VPN service run:move-to-control-group../myvpn.service run:getuidgid run:userenv-fromenv run:setenv LD_LIBRARY_PATH /opt/myvpn/lib run:chdir / run:/opt/myvpn/bin/myvpn-daemon restart:#!/bin/sh restart:sleep 0.1 restart:exec true # ignore script arguments %
Менеджеры служб семейства Daemontools -могут работать в операционных системах, отличных от -Linux,и автоматический перезапуск даже по умолчанию в этом мире.
rc
. Часто задаваемые ответы. Вы можете использовать строковую функцию gsub , которая возвращает количество замен, сделанных в строке. Это удобный способ подсчета вхождений в строке, и вы делаете это для всех строк, так что вы считаете их все.
awk '{cnt += gsub(/United States/,"&")} END {print cnt}' *.csv
Если вы хотите использовать эту проверку внутри скрипта awk, как в вашем примере, вы можете использовать такой синтаксис, как:
awk '{ if (gsub(/pattern/"&")) {"do stuff here"} }' file
или
awk '{x = gsub(/pattern/"&"); "do stuff with x here"; }' file
Также, используя grep
, с -o
мы получим одну строку на совпадение в выводе, и результатом будет количество строк вывода.
grep -o "United States" *.csv | wc -l
Учитывая предоставленный вами образец входного файла, ответ @nezabudka:
awk 'BEGIN {RS=",|\n"} /United States/ {i++} END {print i}' inputFile
кажется правильным. Это побуждает меня спросить вас :, уверены ли вы, что ваш образец входного файла репрезентативен для всех ваших разделителей полей -? Если нет, вот альтернативное решение, которое допускает случаи входного файла, такие как:
> cat inputFile
United States,1,2,3
Donald TRump,1,2,3 United States blih blah \!?# bluh United States
United States,1,2,3,United States
> awk 'BEGIN {RS=",|\n| "}
/United/ {rec=NR; next}
/States/ && NR==rec+1 {i++}
END {print i}' inputFile
5
Команда
#/bin/bash
awk '{print gsub("United States",$0)}' filename| awk 'BEGIN{sum=0}{sum=sum+$1}END{print sum}'