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

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


cookbookshell4

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
cookbookshell4 [2015/10/22 04:35]
sander
cookbookshell4 [2015/10/22 04:37] (текущий)
sander [Слияние файлов по колонкам]
Строка 1: Строка 1:
 +====== Texting and Driving ======
 +===== Регулярные выражения =====
 +**Поиск строки с ip адресом**
 +<​code>​
 +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
 +</​code>​
 +**Компоненты регулярных выражений**
 +<​code>​
 +^    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.
 +</​code>​
 +
 +**Сайт для проверки регулярных выражений** \\
 +http://​regexr.com/​
 +
 +===== Поиск по содержимому grep =====
 +
 +**Поиск в содержимом**
 +<​code>​
 +grep pattern filename
 +-c считает количество строк
 +-v все кроме строки
 +-o только попавшее под совпадение
 +-n печатать номер строку совпадения
 +-l печатает только файл в котором обнаружено совпадение
 +-R рекурсивный поиск
 +-i игнорируем реестр символов
 +-e группируем паттерн поиска grep -e "​pattern1"​ -e "​pattern"​
 +</​code>​
 +
 +**Включения,​ исключения файлов и папок для поиска**
 +<​code>​
 +grep "​main()"​ . -r --include *.{c,cpp}
 +grep "​main()"​ . -r --exclude "​README"​
 +grep "​main()"​ . -r --exclude-dir temp
 +</​code>​
 +
 +**Печать текста до и после относительно строки поиска**
 +<​code>​
 +-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
 +
 +</​code>​
 +
 +===== Обрезание с использованием cut =====
 +**Получение необходимого поля**
 +<​code>​
 +-d разделитель
 +-f номер поля
 +cut -d" " -f1,2 hello
 +cut -d" " -f2-4 hello
 +</​code>​
 +Если не указать разделитель,​ по умолчанию будет табуляция.\\
 +\\
 +**Печатать все за исключением указанного поля** --complement
 +<​code>​
 +cut -d: -f1 --complement /etc/passwd
 +</​code>​
 +
 +===== Работаем с sed =====
 +**Заменяем 1-ое совпадение.**
 +<​code>​
 +echo "Hello Hello" | sed '​s/​H/​h/'​
 +hello Hello
 +</​code>​
 +**Замена с перезаписью файла**
 +<​code>​
 +$ sed '​s/​text/​replace/'​ file >newfile
 +$ mv newfile file
 +or
 +$ sed -i '​s/​text/​replace/'​ file
 +</​code>​
 +**Заменяем все совпадения**
 +<​code>​
 +echo "Hello Hello" | sed '​s/​H/​h/​g'​
 +hello hello
 +</​code>​
 +**Вместо символа / можно использовать и другие**
 +<​code>​
 +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
 +</​code>​
 +**Удаляем строки**
 +<​code>​
 +#​пустые
 +sed '/​^$/​d'​ file
 +#​начинающиеся с #
 +sed '/​^#/​d'​ /​etc/​apache2/​apache2.conf
 +</​code>​
 +**Граничный маркер \b (для определения границ?​)**
 +<​code>​
 +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
 +</​code>​
 +
 +**Работаем с найденной строкой** &
 +<​code>​
 +echo "​ololo"​ | sed '​s/​o/​[&​]/​g'​
 +[o]l[o]l[o]
 +</​code>​
 +
 +**Объединение команд**
 +
 +<​code>​
 +По средствам ;
 +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
 +</​code>​
 +
 +**Сравнение скоростей данных вариантов**
 +<​code>​
 +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
 +
 +</​code>​
 +**Переменные в sed**\\
 +Для использования переменной в sed используются двойные кавычки
 +<​code>​
 +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
 +</​code>​
 +===== Вопросы по sed =====
 +
 +1. Вывести текст Hello User строчными буквами.\\
 +2. Вывести любой конфигурационный файл без комментариев и пустых строк.\\
 +3. Прочитать из файла макадреса вида 0100.0000.0000.00 и перевести их в 00:​00:​00:​00:​00:​00 перезаписав файл.\\
 +<​code>​
 +0154.04a6.0988.24
 +0100.2215.6b01.7e
 +01c8.6000.e1df.07
 +</​code>​
 +4. В тексте "​ololo"​ выделить все буквы o знаками %\\
 +5. В тексте "abc defg hig klmn opy" заменить все 3-символьные сочетания знаком !.  \\
 +
 +===== awk работаем с потоком информации =====
 +**Структура awk**
 +<​code>​
 +awk ' BEGIN{ print "​start"​ } pattern { commands } END{ print "​end"​ } file
 +</​code>​
 +**Считаем количество строк**
 +<​code>​
 +awk 'BEGIN {i=0} {i++} END {print i}' /etc/passwd
 +</​code>​
 +**Переменные в awk**
 +<​code>​
 +root@uba:​~/​script#​ echo | awk '{ var1="​v1";​ var2="​v2";​ var3="​v3";​ print var1,​var2,​var3 ; }'
 +v1 v2 v3
 +</​code>​
 +**Специальные переменные**
 +|NR|It stands for the current record number, which corresponds to the current line number when it uses lines as records|
 +|NF|It stands for the number of fields, and corresponds to the number of fields in the current record under execution (fields are delimited by space)|
 +|$0|It is a variable that contains the text content of the current line under execution| ​
 +|$1|It is a variable that holds the text of the first field|
 +|$2|It is the variable that holds the text of the second field|
 +**Еще одна штука на awk**
 +<​code>​
 +seq 5 | awk '​BEGIN{print "​Summation:"​} {sum+=$1; print $1"​+"​} END {print "​==";​print sum}'
 +Summation:
 +1+
 +2+
 +3+
 +4+
 +5+
 +==
 +15
 +</​code>​
 +**Использование переменных из вне**
 +<​code>​
 +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
 +</​code>​
 +===== Слияние файлов по колонкам =====
 +
 +<​code>​
 +paste /etc/passwd /etc/shadow -d "​|"​
 +</​code>​
cookbookshell4.txt · Последние изменения: 2015/10/22 04:37 — sander