Linux: работа с текстом (sed, awk, tr, cat)

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

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
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}'

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}'

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

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

$ 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

Leave a Reply