Как найти 5 последовательных «0» в файле?

Нет ничего синтаксически неправильного во фрагменте кода, но он необычен.

Чтобы проверить, найдена ли строка в файле, используя 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, если этот файл существует. Измените >на >>на вместо этого добавьте к файлу, если перезапись не предполагается.

6
10.08.2020, 11:13
5 ответов

Вероятно, я бы сделал это в 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 
16
18.03.2021, 23:13
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

3
18.03.2021, 23:13

Сэд может это сделать:

sed -n '/,0,0,0,0,0[,$]/p' file.txt | sed 's/,.*//'
0
18.03.2021, 23:13

Чтобы получить желаемый результат, мы можем попробовать следующие команды.

Гну сед

$ 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.

1
18.03.2021, 23:13

с использованием Раку (урожденная 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

https://raku.org/

1
18.03.2021, 23:13

Теги

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