### 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й символы
Выбрать второй столбец вывода команды:
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}'