Инструменты пользователя

Инструменты сайта


cookbookshell4

Texting and Driving

Регулярные выражения

Поиск строки с ip адресом

egrep [1-2]?[0-9]?[0-9]\.[1-2]?[0-9]?[0-9]\.[1-2]?[0-9]?[0-9]\.[1-2]?[0-9]?[0-9] ip 2>/dev/null

or

[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

or

egrep [1-2]?[0-9]?[0-9]{1}\.+[0-9]?[0-9]?[0-9] ip 2>/dev/null

Компоненты регулярных выражений

^    This specifies the start of the line marker.
$    This specifies the end of the line marker.
.    This matches any one character.
[]   This matches any one of the characters enclosed in [chars].
[^]  This matches any one of the characters except those that are enclosed in [^chars].
[-]  This matches any character within the range specified in [].
?    This means that the preceding item must match one or zero times.
*    This means that the preceding item must match zero or more times.
()   This treats the terms enclosed as one entity.
{n}  This means that the preceding item must match n times.
{n,} This specifies the minimum number of times the preceding item should match.
{n, m} This specifies the minimum and maximum number of times the preceding item should match.
|    This specifies the alternation—one of the items on either of side of | should match.
\    This is the escape character for escaping any of the special characters mentioned previously.

Сайт для проверки регулярных выражений
http://regexr.com/

Поиск по содержимому grep

Поиск в содержимом

grep pattern filename
-c считает количество строк
-v все кроме строки
-o только попавшее под совпадение
-n печатать номер строку совпадения
-l печатает только файл в котором обнаружено совпадение
-R рекурсивный поиск
-i игнорируем реестр символов
-e группируем паттерн поиска grep -e "pattern1" -e "pattern"

Включения, исключения файлов и папок для поиска

grep "main()" . -r --include *.{c,cpp}
grep "main()" . -r --exclude "README"
grep "main()" . -r --exclude-dir temp

Печать текста до и после относительно строки поиска

-B строк до найденной строки
-A строк после найденной строки
-C до и после найденной строки
  
$ seq 10 | grep 5 -A 3
5
6
7
8

$ seq 10 | grep 5 -B 3
2
3
4
5

$ seq 10 | grep 5 -C 3
2
3
4
5
6
7
8

Обрезание с использованием cut

Получение необходимого поля

-d разделитель
-f номер поля
cut -d" " -f1,2 hello
cut -d" " -f2-4 hello

Если не указать разделитель, по умолчанию будет табуляция.

Печатать все за исключением указанного поля –complement

cut -d: -f1 --complement /etc/passwd

Работаем с sed

Заменяем 1-ое совпадение.

echo "Hello Hello" | sed 's/H/h/'
hello Hello

Замена с перезаписью файла

$ sed 's/text/replace/' file >newfile
$ mv newfile file
or
$ sed -i 's/text/replace/' file

Заменяем все совпадения

echo "Hello Hello" | sed 's/H/h/g'
hello hello

Вместо символа / можно использовать и другие

root@uba:~/script# echo "Hello Hello Hello" | sed 's|H|h|g'
hello hello hello
root@uba:~/script# echo "Hello Hello Hello" | sed 's:H:h:g'
hello hello hello

Удаляем строки

#пустые
sed '/^$/d' file
#начинающиеся с #
sed '/^#/d' /etc/apache2/apache2.conf

Граничный маркер \b (для определения границ?)

echo "11 abc 111 this 9 file contains 111 11 88 numbers 0000" | sed 's/\b[0-9]\{3\}\b/NUMBER/g'
11 abc NUMBER this 9 file contains NUMBER 11 88 numbers 0000

без граничного маркера

echo "11 abc 111 this 9 file contains 111 11 88 numbers 0000" | sed 's/[0-9]\{3\}/NUMBER/g'
11 abc NUMBER this 9 file contains NUMBER 11 88 numbers NUMBER0

Работаем с найденной строкой &

echo "ololo" | sed 's/o/[&]/g'
[o]l[o]l[o]

Объединение команд

По средствам ;
echo "0100.1966.4126.de" | sed 's/\.//g; s/^01//; s/[0-9a-zA-Z]\{2\}/&:/g; s/:$//'
00:19:66:41:26:de

По средствам -e

echo "0100.1966.4126.de" | sed -e 's/\.//g' -e 's/^01//' -e 's/[0-9a-zA-Z]\{2\}/&:/g' -e 's/:$//'
00:19:66:41:26:de

По средствам пайплайна |

echo "0100.1966.4126.de" | sed 's/\.//g' | sed 's/^01//' | sed 's/[0-9a-zA-Z]\{2\}/&:/g' | sed 's/:$//'
00:19:66:41:26:de

Сравнение скоростей данных вариантов

root@uba:~/script# time echo "0100.1966.4126.de" | sed 's/\.//g' | sed 's/^01//' | sed 's/[0-9a-zA-Z]\{2\}/&:/g' | sed 's/:$//'
00:19:66:41:26:de

real    0m0.015s
user    0m0.000s
sys     0m0.008s
root@uba:~/script# time echo "0100.1966.4126.de" | sed -e 's/\.//g' -e 's/^01//' -e 's/[0-9a-zA-Z]\{2\}/&:/g' -e 's/:$//'
00:19:66:41:26:de

real    0m0.006s
user    0m0.000s
sys     0m0.000s
root@uba:~/script# time echo "0100.1966.4126.de" | sed 's/\.//g; s/^01//; s/[0-9a-zA-Z]\{2\}/&:/g; s/:$//'
00:19:66:41:26:de

real    0m0.006s
user    0m0.000s
sys     0m0.000s

Переменные в sed
Для использования переменной в sed используются двойные кавычки

text=hello
root@uba:~/script# echo hello world | sed 's/$text/HELLO/'
hello world
root@uba:~/script# echo hello world | sed "s/$text/HELLO/"
HELLO world

Вопросы по sed

1. Вывести текст Hello User строчными буквами.
2. Вывести любой конфигурационный файл без комментариев и пустых строк.
3. Прочитать из файла макадреса вида 0100.0000.0000.00 и перевести их в 00:00:00:00:00:00 перезаписав файл.

0154.04a6.0988.24
0100.2215.6b01.7e
01c8.6000.e1df.07

4. В тексте «ololo» выделить все буквы o знаками %
5. В тексте «abc defg hig klmn opy» заменить все 3-символьные сочетания знаком !.

awk работаем с потоком информации

Структура awk

awk ' BEGIN{ print "start" } pattern { commands } END{ print "end" } file

Считаем количество строк

awk 'BEGIN {i=0} {i++} END {print i}' /etc/passwd

Переменные в awk

root@uba:~/script# echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3 ; }'
v1 v2 v3

Специальные переменные

NRIt stands for the current record number, which corresponds to the current line number when it uses lines as records
NFIt stands for the number of fields, and corresponds to the number of fields in the current record under execution (fields are delimited by space)
$0It is a variable that contains the text content of the current line under execution
$1It is a variable that holds the text of the first field
$2It is the variable that holds the text of the second field

Еще одна штука на awk

seq 5 | awk 'BEGIN{print "Summation:"} {sum+=$1; print $1"+"} END {print "==";print sum}'
Summation:
1+
2+
3+
4+
5+
==
15

Использование переменных из вне

root@uba:~/script# var=1000
root@uba:~/script# echo | awk '{print v}' v=$var
1000

or

root@uba:~/script# echo | awk -v v=$var '{print v}'
1000

Слияние файлов по колонкам

paste /etc/passwd /etc/shadow -d "|"
cookbookshell4.txt · Последние изменения: 2015/10/22 04:37 — sander