Mikhail Voronin

Сборник рецептов для SED и AWK

     

 Linux

Поиск в файле или потоке ввода

Обычно для поиска в файле или фильтрации потока ввода используют grep.
  1. $ cat /etc/hosts | grep localhost
  2. 127.0.0.1 localhost
Но grep ничего не знает про номера строк. И grep не может начать фильтровать со второй строки, поэтому заголовок тоже фильтруется. А это очень не удобно. Но можно использовать awk. Вот, например, эта команда выведет нам легковесные процессы Celery:
  1. $ ps -eLf | awk 'NR==1 || /celery/'
  2. UID PID PPID LWP C NLWP STIME TTY TIME CMD
  3. username 10393 28468 10393 1 1 20:56 pts/8 00:00:00 /path/bin/python /path/bin/celery -A prjname worker -l info
  4. username 10398 10393 10398 0 1 20:56 pts/8 00:00:00 /path/bin/python /path/bin/celery -A prjname worker -l info
  5. username 10399 10393 10399 0 1 20:56 pts/8 00:00:00 /path/bin/python /path/bin/celery -A prjname worker -l info
  6. username 10400 10393 10400 0 1 20:56 pts/8 00:00:00 /path/bin/python /path/bin/celery -A prjname worker -l info
  7. username 10401 10393 10401 0 1 20:56 pts/8 00:00:00 /path/bin/python /path/bin/celery -A prjname worker -l info
  8. username 10471 8151 10471 0 1 20:57 pts/13 00:00:00 awk NR==1 || /celery/
Первая строка с заголовками выведена, что нам и было нужно.

Удаление строк

Удаление однострочных комментариев:
  1. $ sed -e 's/#.*$//' $INPUTFILE
Удаление пустых строк:
  1. $ sed -e '/^$/d' $INPUTFILE
Удаление комментариев и удаление пустых строк:
  1. $ sed -e 's/#.*$//' -e '/^$/d' $INPUTFILE

Замена подстроки

Изменение имени хоста:
  1. $ sed -i -r -e 's/^(127\.0\.1\.1\s+)[-a-z0-9]+/\1HOSTNAME/g' /etc/hosts
Изменение параметров в конфигурационном файле NGINX:
  1. $ sed -i -r -e 's/^(\s+)#\s+(server_names_hash_bucket_size\s+)[0-9]+(;.*)/\1\264\3/g' /etc/nginx/nginx.conf
Изменение настроек Postgres:
  1. $ sed -r -e "s/^.*(listen_addresses\s*=\s*)(')(.+)(')/\1\20.0.0.0\4/g" /etc/postgresql/9.3/main/postgresql.conf
Добавить что-нибудь (например, кавычки) в начало строки, каждой строки файла.
  1. $ sed 's/^/"/' input.txt
Добавить (например, запятую) в конец строки, каждой строки файла.
  1. $ sed 's/$/,/' input.txt
Сделать первую букву заглавной в каждой строке файла.
  1. $ sed -e "s/^\(.\)/\u\1/g" input.txt

Генерация паролей и хешей

Генерация SHA1 хеша строки:
  1. $ echo -n "test string" | sha1sum | awk '{print $1}'

 awk sed