Нет ничего синтаксически неправильного во фрагменте кода, но он необычен.
Чтобы проверить, найдена ли строка в файле, используя grep
, и сделать что-то, если это так, используйте
if grep -qwF ssl_certificate /etc/nginx/conf.d/platform.conf; then
Параметры -q
, -w
и -F
сделают grep
тихим(-q
)и будут соответствовать заданному шаблону как фиксированная строка, а не как регулярное выражение(-F
). Более того, -w
заставит grep
искать полное слово . В этом случае строка ssl_certificate3
будет , а не соответствовать шаблону.
grep
вернет нулевой статус выхода, если строка была найдена в файле, и тело инструкции if
будет выполнено.
Заявление
echo $(somecommand)
немного бесполезен.
Подстановка команды $(somecommand)
будет заменена выводом somecommand
, и оболочка выполнит разбиение на слова и создание имени файла для результирующей строки (, что, вероятно, нежелательно ). Использование этого с echo
бесполезно в том смысле, что вы могли просто сделать
somecommand
Полное if
утверждение:
if grep -qwF ssl_certificate /etc/nginx/conf.d/platform.conf; then
grep -wF ssl_certc /etc/nginx/conf.d/file.conf >/etc/nginx/conf.d/file-certs.conf
fi
(Это предполагает, что ssl_certc
— полное слово. Удалите -w
из этого grep
, иначе)
В качестве альтернативы, используя синтаксис короткого замыкания,
grep -qwF ssl_certificate /etc/nginx/conf.d/platform.conf &&
grep -wF ssl_certc /etc/nginx/conf.d/file.conf >/etc/nginx/conf.d/file-certs.conf
Обратите внимание, что это перезапишет содержимое /etc/nginx/conf.d/file-certs.conf
, если этот файл существует. Измените >
на >>
на вместо этого добавьте к файлу, если перезапись не предполагается.
Вероятно, я бы сделал это в awk
, используя ,
в качестве разделителя:
$ awk -F, '/,0,0,0,0,0/{print $1}' file
def
Тем не менее, это также захватит строку, подобную этой:
mno,6,7,0,0,0,0,0.5
Во избежание этого совпадайте, только если за последним 0
следует ,
или конец строки:
awk -F, '/,0,0,0,0,0(,|$)/{print $1}' file
grep '0,0,0,0,0' file.txt
печатает соответствующую строку:def,6,7,0,0,0,0,0,2,5
grep '0,0,0,0,0' file.txt | cut -d, -f1
печатает первое поле, используя ,
в качестве разделителя:def
Сэд может это сделать:
sed -n '/,0,0,0,0,0[,$]/p' file.txt | sed 's/,.*//'
Чтобы получить желаемый результат, мы можем попробовать следующие команды.
Гну сед
$ sed -nE 'G;y/,/\n/;/(\n0){5}\n/P' file
$ awk -F, '/(,0){5}(,|$)/ && $0 =$1""' file
$ grep -oP '^[^,]+(?=.*?(,0){5}(,|$))' file
Grep с включенным режимом PC Re мы ищем пять последовательных ,0
внутри предпросмотра, чтобы они не попали в выходной пакет grep.
с использованием Раку (урожденная Perl6)
Ниже приведен ответ, который пытается включить (и преодолеть )возражения, упомянутые @J -L и @terdon. Также возвращаются строки с 5 -или -более последовательными нулями. Сначала начните с расширения тестового файла:
$ cat 5or6_consec_zeros.txt
Name,X,7/27,7/28,7/29,7/30,7/31,8/1,8/2,8/3,8/4
abc,N,5,3,8,8,0,0,0,0,11
def,Y,6,7,0,0,0,0,0,2,5
ghi,N,1,3,5,2,0,0,5,3,6
jkl,N,1,3,5,2,0,0,0,0,0.5
mno,N,7.0,0,0,0,0,2,3,4,5
pqr,Y,1,3,3,0,0,0,0,0,0
stu,Y,1,3,0,0,0,0,0,0,3
vwx,Y,1,3,8,7,0,0,0,0,0
Флаг командной строки -ne указывает Raku запускать строку кода -за строкой -. Регулярное выражение пытается сопоставить два токена. В первом токене он пытается сопоставить ровно 5 повторов последовательности из двух -символов " ,0
". Во втором токене регулярное выражение пытается сопоставить либо завершающую запятую, либо конец -строки -токена $$
(после @terdon):
[Обратите внимание, что в Raku оператор чередования |
реализует самую длинную -токен -, соответствующую (LTM )стратегии. Если в какой-то момент вам нужно реализовать стратегию Perl5 -, например «первое -совпадение» в Raku, вы используете оператор чередования Raku ||
«первое -соответствие».
$ raku -ne 'when / [\,0]**5 [\,|$$] / -> {.put };' 5or6_consec_zeros.txt
def,Y,6,7,0,0,0,0,0,2,5
pqr,Y,1,3,3,0,0,0,0,0,0
stu,Y,1,3,0,0,0,0,0,0,3
vwx,Y,1,3,8,7,0,0,0,0,0
Чтобы вернуть только первый «столбец» из (существенно )запятых -разделенных -значений, Raku предоставляет явный split()
метод:
$ raku -ne 'when / [\,0]**5 [\,|$$] / -> { put.split(",")[0] };' 5or6_consec_zeros.txt
def
pqr
stu
vwx