### awk grep sed cut cat

Команды построчно читают вывод других команд или файлы.

Grep умеет фильтровать по включениям слов в строчку, в том числе регэксп.

egrep или grep -e использует расширенные регулярки.

Эквивалентные группировки:

grep "\(grouping\)" file.txt
grep -E "(grouping)" file.txt
egrep "(grouping)" file.txt

Awk более быстрая и гибкая утилита, более того, это язык программирования, предназначенный для обработки текста/данных.

awk опции ‘ условие {действие} условие {действие}’

где опции:

  • -F, —field-separator — разделитель полей, используется для разбиения текста на колонки;
  • -f, —file — прочитать данные не из стандартного вывода, а из файла;
  • -v, —assign — присвоить значение переменной, например foo=bar;
  • -b, —characters-as-bytes — считать все символы однобайтовыми;
  • -d, —dump-variables — вывести значения всех переменных awk по умолчанию;
  • -D, —debug — режим отладки, позволяет вводить команды интерактивно с клавиатуры;
  • -e, —source — выполнить указанный код на языке awk;
  • -o, —pretty-print — вывести результат работы программы в файл;

действия:

  • print(строка) — вывод чего либо в стандартный поток вывода;
  • printf(строка) — форматированный вывод в стандартный поток вывода;
  • system(команда) — выполняет команду в системе;
  • length(строка) — возвращает длину строки;
  • substr(строка, старт, количество) — обрезает строку и возвращает результат;
  • tolower(строка) — переводит строку в нижний регистр;
  • toupper(строка) — переводить строку в верхний регистр.

переменные и операторы для действий:

  • FNR — номер обрабатываемой строки в файле;
  • FS — разделитель полей;
  • NF — количество колонок в данной строке;
  • NR — общее количество строк в обрабатываемом тексте;
  • RS — разделитель строк, по умолчанию символ новой строки;
  • $ — ссылка на колонку по номеру.

 

 

cat — выводит содержимое файла.

cat file.txt | grep "\.$" — строки заканчиваются на точку

cat file.txt | grep ",$" — строки заканчиваются на запятую

cut — построчно вырезает лишнее, в деталях тут.

cut -b 1,2,3 file.txt — оставит первые 3 символа

cut -b 1-3, 6-8 file.txt — первые 3 и с 6 по 8й символы

 

sed

Выбрать второй столбец вывода команды:

sudo dpkg -l | awk ' {print $2} '

Тот же второй столбец dpkg с выводом установленных пакетов, но только строки с «server»:

sudo dpkg -l | grep servser| awk ' {print $2} ' 

sudo dpkg -l | grep -v servser| awk ' {print $2} ' * эти строки не содержат «server»

dpkg -l | awk ' /'server'/ {print $2} '

Размер свободного места на диске:

df -h | awk ' /'sda'/ {print $4}'

* можно сделать вывод для generic monitor xfce, разместив код

sh df -h | awk ' /'sda6'/ {print $4}'

в файле sda6freespace.sh  и выполнив в genmon

sh /home/user/.scripts/sda6freespace.sh

Cписок IP-адресов, которые подключены к серверу:

netstat -anp|grep tcp|awk '{print $5}'| cut -d : -f1 | sort | uniq -c | sort -n

Удалить дубликаты строк из файла:

awk '!x[$0]++' source.txt > terget.txt

А можно проще:

uniq file.txt

uniq -c  укажет количество совпадений в начале строки,
uniq -d — выведет только повторяющиеся строки,
uniq -D — то же, но с выводом всех повторений,
uniq -u — вывод только не повторяющихся,
uniq -f 2 — пропустит первые 2 поля, а потом проверит на уникальность,
uniq -s 3 — пропустит первые 3 символа, а потом проверит на уникальность,
uniq -w 3 — поймает, где первые 3 символа одинаковые, и выведет эти первые 3 символа,
uniq -i — уберёт лишние не учитывая регистр.

Количество строк в файле:

awk 'END { print NR }' sample_file

Все строки в файле, которые содержат строки, начинающиеся с ‘ A ‘ или ‘a’, за которыми следует ‘ re’:

awk '/[Aa]re/{print}' file.txt

То же, но добавит номера найденных срок в начало строк вывода:

awk '/[Aa]re/{print}' file.txt | grep -n a

С регулярками, найдёт f в начале, и без 1 в конце строки:

awk '/[Aa]Mb/{print}' file.txt | grep -v 1$

Сначала отфильтрует(исключит) грепом по вхождению ..(любые 2 символа) затем «O» или «o» или «e» и потом «b» на конце, далее авк возьмёт строки, где вначале идёт Mb или mb:

grep -v "..[Ooe]b$" file.txt | awk '/[Mm]b/{print}'

Cтроки с вхождением byte, bytes, byte* в начале строки:

grep ^"byte" file.txt

.code , что не совпадает с code, т. е, например Code:

grep "[^c]ode" file.txt

Начинается с заглавной и заканчивается точкой. Обратная косая перед последней точкой говорит команде «избегать» ее, так что последняя точка представляет буквальную точку и не имеет значения «любой символ»:

cat file.txt | grep "^[A-Z].*\.$"

Привет «классы символов стандарта POSIX«, строки начинаются на заглавные:

grep "^[[:upper:]]" file.txt

Cовпадения строки «free» плюс 1 или больше символов. Символ «+» ищет совпадения выражений 1 или больше раз. Он работает почти как символ «*», но при использовании «+» выражение должно совпасть хотя бы 1 раз.

grep -E "free[^[:space:]]+" file.txt

Все строки, где есть три гласные:

grep -E "[AEIOUaeiou]{3}" file.txt

Все пользователи и их id (-F":" — разделитель двоеточие, по-умолчанию awk разделяет поля пробелами):

awk -F":" '{ print $3 " - " $1}' /etc/passwd

Вывод последнего поля, если лень считать или оно не предсказуемо:

echo 'one two three four' | awk '{print $NF}'

или предпоследнего:

echo 'one two three four' | awk '{print $NF-1}'

или от середины плюс одно:

echo 'one two three four' | awk '{print $((NF/2)+1)'

Сложить значения второго столбца из file.txt (все «3a» станут «3», а «a3» проигнорируются ):

awk '{sum+=$2} END {print sum}' file.txt

Переданные байты из лога, 10й столбец:

cat /var/log/apache2/access.log | awk '{print $10}'

Сложим последние столбцы строк:

< file.txt awk '{totalBytes+=$NF} END {print totalBytes}'