Команда grep – полезные ключи и примеры использования

Рейтинг: 5  / 5

Соединение строк в Python

Рассматривая простейшие операции со строками, мы увидели, как объединяются строки через операцию сложения. Однако есть и другая возможность для соединения строк — метод join():, объединяющий списки строк. В качестве разделителя используется текущая строка, у которой вызывается этот метод:

А если вместо списка в метод join передать простую строку, разделитель будет вставляться уже между символами:

Приходите на курс «Разработчик Python» в OTUS. Не упустите свой шанс получить углубленные знания от практикующих экспертов!ЗАПИСАТЬСЯ НА КУРС

Поиск по регулярному выражению в grep

Это всё, конечно, замечательно, но я бы хотел при поиске определения функции искать именно определение функции, без указания файлов, где она только упоминается. То есть мне нужна строка, где будет тип возвращаемого значения (char*), после которого будет идти какое-то количество спец-слов и пробелов, а потом название функции. Нет ничего проще:

grep -r -C 3 -E ‘char.*?\*.*?SDL_GetError’ /usr/local/include

Почти все ключи нам известны кроме -E – он включает режим расширенных регулярных выражений для шаблона поиска. Так в данном регулярном выраженнии мы написали ‘char.?*.?SDL_GetError’ то есть:

  • в строке должная встретиться подстрока «char»,
  • сразу за ней должны встретиться любые символы до «*». Тут важно сказать, что . в регулярных выражениях отвечает за любой символ, * – модификатор, указывающий количество: от 0 до бесконечности повторений. Далее идёт ? – ограничитель жадности: да, любое количество повторений, пока не встретишь следующее из регулярного выражения.
  • \* – мы уже знаем, что * – спец. символ, означающий любое количество повторений. Поэтому, чтобы указать, что здесь должна быть просто *, мы используем экранирующий символ – \. Им же мы можем указать, что нужен символ «точка» или «вопросительный знак», не указывая на их дополнительные символы в рамках данного диалекта регулярных выражений.
  • снова .*? – съедаем все символы, не относящиеся к далее идущим в регулярке.
  • ну и наша функция «SDL_GetError».

Схематично это можно выразить следующим образом:

| char | .*? | \* | .*? | SDL_GetError | extern DECLSPEC | char | | * | SDLCALL | SDL_GetError | (void);

Регулярные выражения – отнюдь не очевидная тема. И понять её с ходу вы вряд лм сможете. Я подготовил некоторое объяснение в рамках второй пары по Linux. Но явно нужно более тщательное рассмотрение этой темы.

Читайте также:  Русификация Сhromium в Ubuntu (Linux Mint)

Как использовать коды завершения в Bash-скриптах

Удаление из скрипта команды echo позволило нам получить код завершения. Что делать, если нужно сделать разные действия в случае успешного и неуспешного выполнения команды touch? Речь идёт о печати stdout в случае успеха и stderr в случае неуспеха.

Проверяем коды завершения

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

#!/bin/bash touch /root/test 2> /dev/null if [ $? -eq 0 ] then echo «Successfully created file» else echo «Could not create file» >&2 fi

После рефакторинга скрипта получаем такое поведение:

  • Если команда touch выполняется с кодом 0, скрипт с помощью echo сообщает об успешно созданном файле.
  • Если команда touch выполняется с другим кодом, скрипт сообщает, что не смог создать файл.

Любой код завершения кроме 0 значит неудачную попытку создать файл. Скрипт с помощью echo отправляет сообщение о неудаче в stderr.

Выполнение:

$ ./ Could not create file

Создаём собственный код завершения

Наш скрипт уже сообщает об ошибке, если команда touch выполняется с ошибкой. Но в случае успешного выполнения команды мы всё также получаем код 0.

$ ./ Could not create file $ echo $? 0

Поскольку скрипт завершился с ошибкой, было бы не очень хорошей идеей передавать код успешного завершения в другую программу, которая использует этот скрипт. Чтобы добавить собственный код завершения, можно воспользоваться командой exit.

#!/bin/bash touch /root/test 2> /dev/null if [ $? -eq 0 ] then echo «Successfully created file» exit 0 else echo «Could not create file» >&2 exit 1 fi

Теперь в случае успешного выполнения команды touch скрипт с помощью echo сообщает об успехе и завершается с кодом 0. В противном случае скрипт печатает сообщение об ошибке при попытке создать файл и завершается с кодом 1.

Выполнение:

$ ./ Could not create file $ echo $? 1

Просмотр содержимого файла

Через терминал можно не только просматривать содержимое текстового файла, но и проводить анализы, например сортировать и менять порядок строк по содержанию, подсчитывать количество строк, слов, символов, и выделить столбцы, если это табличный файл. Рассмотрим их в действии:

Читайте также:  Как управлять файлами в терминале Linux и на рабочем столе

# grep: фильтрация по строкам grep 455 # вывести строку, где есть 455 # cut: отображение столбцов cut -f 3 # вывести только третий столбец cut -f 2-3 # вывести 2-ой и 3-ий столбец cut -c 9-19 # вывести от 9-ти до 19-ти символов каждой строки cut -f 1 -d ‘;’ # в файле использовать ‘;’ в качестве разделителя вместо tab # awk: то же, что и cut, но имеет ещё больше разделителей, фильтров и он более сложный в вычислении awk ‘{print $3}’ # вывести 3-ий столбец awk ‘{print $2 «, » $3}’ # вывести 2-ой и 3-ий столбец, и разделить запятой awk ‘{print $2 + $3}’ # вывести сумму 2-го и 3-го столбца awk ‘length($0) > 20’ # вывести все строки длиннее 20 символов awk ‘$2 > 100′ # вывести строки, в которых значение второго столбца больше 100 # wc wc # вывести количество строк, слов и символов в текстовом файле ls -1 | wc # вывести количество строк, слов и символов каждого файла в текущем каталоге # sort: сортировка строк по алфавиту sort # сортировка строк файла sort -r # сортировка в обратном порядке sort -R # сортировка в случайном порядке sort -t $’\t’ -k 3n,3 # сортировать строки по числовому значению третьего столбца # uniq: отображает неповторяющиеся и повторяющиеся строки файла uniq # опускает повторяющиеся строки uniq -d # выводит только повторяющиеся строки uniq -u # выводит только те строки, у которых нет повторов uniq -c # выводит количество повторов для каждой строки

Надеюсь вам понравится эта шпаргалка!

  • Как писать Bash-однострочники для клонирования и управления GitHub/GitLab репозиториями
  • Автоматизированное семантическое управление версиями с помощью GitVersion
  • Основы Git за 5 минут

Читайте нас в Telegram, VK и

Перевод статьи Guillermo Barreiro: The Essential Bash Cheat Sheet

Работа с подстроками

Рассмотрим javascript функции для работы с подстроками.

  • slice(start, [end]) — возвращает символы, между конкретных позиций.

    let s = ‘0123456789’; let s_new = (0, 4); (s_new); // 0123

    Если второй параметр не указан, то вернет всё до конца строки.

  • substring(start, [end]) — работает аналогично. Отличие от «slice» в 2 моментах. Если стартовое значение больше конечного, то первая функция вернет пустую строку.

    let s = ‘0123456789’; ((6, 4)); // » ((6, 4)); // 45

    Ещё различие в подходе при неверных параметрах.

    let s = ‘0123456789’; ((-4, -2)); // 67 ((-4, -2)); // »

    Функция «slice()» конвертирует отрицательные значения в положительные, отталкиваясь от длины строки, а «substring()» просто устанавливает их в ноль, поэтому возвращает пустую строку.

  • substr(start, [length]) — возвращает подстроку, начиная с определенной позиции и определенной длины.

    let s = ‘0123456789’; let s_new = (4, 3); (s_new); // 456

Выборочное удаление конкретных строк:

sed ‘/Iowa/,/Montana/d’

Удалить дубликаты последовательных строк файла (эмулирует “uniq”). Первая строка из двух дублирующих сохраняется, остальное удаляется.

sed ‘$!N; /^(.*)n1$/!P; D’

Удалить дубликаты непоследовательных строк из файла. Остерегайтесь переполнения буфера или используйте GNU sed.

sed -n ‘G; s/n/&&/; /^([ -~]*n).*n1/d; s/n//; h; P’

Удалить все строки, кроме дублирующих строк (эмулирует “uniq -d”).

sed ‘$!N; s/^(.*)n1$/1/; t; D’

Удалить первые 10 строк файла

sed ‘1,10d’

Удалить последние строки файла

sed ‘$d’

Удалить последние 2 строки файла

sed ‘N;$!P;$!D;$d’

Удалить последние 10 строк файла

Способ 1

sed -e :a -e ‘$d;N;2,10ba’ -e ‘P;D’

Способ 2

sed -n -e :a -e ‘1,10!{P;N;D;};N;ba’

Удалить каждую восьмую строку файла

Только GNU sed

gsed ‘0~8d’

Другие sed

sed ‘n;n;n;n;n;n;n;d;’

Удалить строки, содержащие паттерн

sed ‘/pattern/d’

Удалить ВСЕ пустые строки из файла (то же самое что и “grep ‘.’ “)

Способ 1

sed ‘/^$/d’

Способ 2

sed ‘/./!d’

Удалить все ПОСЛЕДОВАТЕЛЬНЫЕ пустые строки из файла, кроме первой, также удаляет все пустые строки в начале и в конце файла (эмулирует “cat -s”)

Способ 1, позволяет 0 пустых строк вверху, 1 в EOF

sed ‘/./,/^$/!d’

Способ 2, позволяет 1 пустую строку вверху, 0 в EOF

sed ‘/^$/N;/n$/D’

Удалить все ПОСЛЕДОВАТЕЛЬНЫЕ пустые строки из файла кроме первых двух:

sed ‘/^$/N;/n$/N;//D’

Удалить все первые пустые строки в файле

sed ‘/./,$!d’

Удалить все конечные пустые строки в файле

sed -e :a -e ‘/^n*$/{$d;N;ba’ -e ‘}’ # works on all seds

Удалить последнюю строку каждого параграфа

sed -n ‘/^$/{p;h;};/./{x;/./p;}’

; — разделитель команд оболочки

В командной строке Вы можете вводить столько команд, сколько Вам нужно, если Вы разделяете каждую из них точкой с запятой (;). Мы сделаем это в следующем примере:

ls> ; wc -l ; rm

; - разделитель команд оболочки

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

Если Вы хотите остановить последовательность выполнения в случае сбоя одной команды, используйте двойной амперсанд (&&) вместо точки с запятой:

cd ./doesntexist && cp ~ / Documents / reports / *.

; - разделитель команд оболочки