Linux: работа с текстом (sed, awk, tr, cut, cat/tac, tee, column, uniq, sort)

GREP в отдельной статье

 

tr, CUT

Подмена всех пробелов (в том числе повторяющихся) на одну запятую с использованием опции -s.

 -s Squeeze multiple occurrences of the characters listed in the last operand (either string1 or string2) in the input into a single instance of the character. This occurs after all deletion
and translation is completed.
$ ls -lh
total 32
drwx------+ 7 petrredkin staff 224B Mar 24 18:33 Desktop
drwx------+ 8 petrredkin staff 256B Mar 21 22:24 Documents
drwx------+ 7 petrredkin staff 224B Apr 4 09:24 Downloads
drwx------@ 90 petrredkin staff 2.8K Apr 1 08:34 Library
drwx------ 4 petrredkin staff 128B Mar 24 16:20 Movies
drwx------+ 3 petrredkin staff 96B Mar 21 20:08 Music
drwx------+ 4 petrredkin staff 128B Mar 21 20:10 Pictures
drwxr-xr-x+ 4 petrredkin staff 128B Mar 21 20:08 Public
drwxr-xr-x@ 6 petrredkin staff 192B Mar 24 16:02 Yandex.Disk.localized

$ ls -lh | tr -s " " ","
total,32
drwx------+,7,petrredkin,staff,224B,Mar,24,18:33,Desktop
drwx------+,8,petrredkin,staff,256B,Mar,21,22:24,Documents
drwx------+,7,petrredkin,staff,224B,Apr,4,09:24,Downloads
drwx------@,90,petrredkin,staff,2.8K,Apr,1,08:34,Library
drwx------,4,petrredkin,staff,128B,Mar,24,16:20,Movies
drwx------+,3,petrredkin,staff,96B,Mar,21,20:08,Music
drwx------+,4,petrredkin,staff,128B,Mar,21,20:10,Pictures
drwxr-xr-x+,4,petrredkin,staff,128B,Mar,21,20:08,Public

(Linux работа с текстом – tr, sort, cut, Linux спец. символы) в bash передача в консоль TAB делается через ctrl+v и после этого нажатия на TAB. С помощью tr можно подменить любой символ/последовательность на TAB, используя delimiter TAB можно отсортировать значения sort (-t), используя cut выделить столбцы по delimiter TAB (-d) (аналогично можно и AWK).

$ ls -ltr | tr -s ' ' ' ' | sort -t ' ' -k 5n | cut -d ' ' -f 5,9
15 dir_lst.txt
17 sw
32 ping_list.txt
32 ping_list2.txt
64 dir1
64 dir2
64 dir3
96 Music
128 Movies
128 Pictures
128 Public
192 Yandex.Disk.localized
224 Downloads
224 Desktop
256 Documents
2880 Library
SED

Удаляем первую, первую + пятую строки

sed 1d <file>
sed '1d;5d' <file>

Удаление пустых строк (Sed delete empty lines)

sed '/^ *$/d' sw # базовый вариант
sed '/^[[:space:]]*$/d' # любой whitespace как пустое место
sed -r '/^\s*$/d'
Показать в файле все, что выше match.
sed '/3007791/q'

sed с whitespace и cat -v + tr может использоваться для удаления ^M в разных выгрузках из Windows.

cat -v sw | tr "^M" " "
sed 's/[[:space:]]$//g' sw

Groups с sed – не забываем про экранирование спец. символов. Например, добавляем пробелы после каждого символа:

# echo "12345" | sed 's/\(.\)/\1 /g'
1 2 3 4 5

 

AWK

awk – очень сильный инструмент и полноценный скриптовый язык программирования.

Помимо “стандартного” отображения определенного столбца с возможностью задания delimiter с помощью него можно искать текст (замена grep), сортировать его (замена sort), исключать дубли (замена uniq), делать сводки, аналогичные excel.

В awk скриптах можно создавать массивы, циклы, условия.

Практика

delimeter

-F – указать разделитель ввода.

Разделитель может быть не символ, а целый набор символов и даже фраз:

awk -F'->' '{print $2}' test | awk -F'тест тест' '{print $1}'

OFS – указать разделитель вывода. По умолчанию AWK подменяет delimiter на пробел, даже при использовании -F. Используя OFS можно задать разделитель вывода или сохранить разделитель файла. Очень удобно при работе с CSV.

awk -F'\t' '{OFS=";"} {print $1,$2,$3}'

awk as a grep

Заменяем grep на awk (grep open = /open/):

nmap -T5 -PN -p 80 -oG - $1 | awk '/open/{print $2}'

last column

Удалить первый столбец из файла (вывода):

awk '{$1=""}1'

Удалить последний столбец из файла:

awk '{$NF=""}1'

Удалить три последних столбца из файла:

awk '{$NF="";$(NF-1)="";$(NF-2)="";$(NF-3)=""}1'

randomize string

cat <file> |awk '{print rand()"\t"$0}' |sort |awk -F'\t' '{print $2}'

чтение с конца

tac <file> # удобно для чтение лог-файла

агрегирующая функция

простейшая – складываем все значения в столбце

$ cat >123
1
2
3
4
5
55
$ cat 123 | awk '{ CNT +=$1 } END { print CNT; }'
70

аналог саммари сводного отчета Excel

awk '{a[$1]+=$2} END{for (i in a) print a[i],i}'

$ cat sw
str 5
btr 1
str 7
btt 4
btr 31
str 11

$ cat sw | awk '{a[$1]+=$2} END{for (i in a) print a[i],i}' | awk '{print $2,$1}' | sort -n -k 2 # с сортировкой по возрастанию
btt 4
str 23
btr 32

AWK + PRINTF + INTERACTIVE AWK – аналог нижестоящей функции Column – вывод данных в стобцах с фиксированных для столбцов размером с указанием размера каждого столбца. Кроме того испольуется interactive AWK, который позволяет работать с выводом tail без буфферизации (т.е. вывод попадает сразу на обработку без ожидания объема).

tail -f Test.csv | awk -W interactive -F ';' '{printf "%20s %20s %20s %20s \n", $1,$3,$6,$12}'

 

COLUMN

column -t – крайне полезная утилита и опция для представления данных в табличном виде.

cat sw
1 2 3
213123 1 1
1 454535 5
4 11 43423432

uniq

sort -u – сортировка и сохраненик уникальных записей

uniq – сохранение уникальных записей без сортировки

sort -u -k5,5 – уникальность записей (uniq) по конкретному столбцу
Уникальность без сортировки. Полезная штука когда нужно сохранить порядок занесенных строк и удалить при этом дубли.
awk '!a[$0]++'
Sort
sort может одновременно несколько сортировок сразу делать (как excel).
Пример сортировки по трем столбцам csv файла с разделителем ;. Первый столбец с числами, остальные два с текстом.
sort -t \; -k 4n -k 5 -k 8 /home/user/report.csv
-k – сортировка по конкретному столбцу
-n – считаем что сортируем только числа. В начальных опциях следует использовать только если все глобально будут сортироваться как числа! Иначе -n будет применен для всех столбцов.
sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 – сортировка списка IP по возрастанию.

(Linux работа с текстом – tr, sort, cut, Linux спец. символы) в bash передача в консоль TAB делается через ctrl+v и после этого нажатия на TAB. С помощью tr можно подменить любой символ/последовательность на TAB, используя delimiter TAB можно отсортировать значения sort (-t), используя cut выделить столбцы по delimiter TAB (-d) (аналогично можно и AWK).

$ ls -ltr | tr -s ' ' ' ' | sort -t ' ' -k 5n | cut -d ' ' -f 5,9
15 dir_lst.txt
17 sw
32 ping_list.txt
32 ping_list2.txt
64 dir1
64 dir2
64 dir3
96 Music
128 Movies
128 Pictures
128 Public
192 Yandex.Disk.localized
224 Downloads
224 Desktop
256 Documents
2880 Library
TEE

Tee – очень удобная, но часто забываемая утилита (по крайней мере мной). Удобство в том, что она позволяет как отображать STDOUT в shell, так и писать в файл одновременно.

$ cat ping_list.txt | tee ping_list2.txt 
1.1.1.1
8.8.8.8
4.4.8.8
8.8.4.4

$ cat ping_list2.txt 
1.1.1.1
8.8.8.8
4.4.8.8
8.8.4.4

Заменяем “echo “fdsfdsf” > file”, на echo + pipe + tee. Извращение взято отсюда.

echo "<html><body><h2>Welcome to Azure! My name is $(hostname).</h2></body></html>" | tee -a index.html

Leave a Reply