notes

Text Processing

Globbing

  1. globbing - file name substitution by bash
  2. man 7 glob - globbing overview
  3. Restricted amount of BRE is used for globbing
    • * - any character any number of times
    • ? - any character one time
    • [xyz] - x, y or z
    • [a-z] - characters from a to z
    • [^az] - not a or z
    • {a*, b*} - a* or b*

Regex

  1. man 7 regex - get help about regex
  2. It’s better to use quotes ’‘ to prevent shell globbing
  3. There are the following types of regular expressions in linux
    • BRE - basic regular expressions
      • grep
      • sed
    • ERE - extended regular expressions
      • egrep
      • awk
      • perl
    • PRE - perl regular exressions
  4. With BRE we need to escape symbols like {}, (), +, ?, |
  5. Regexp
    • ^ - start of a string
      • ^abc => abc, abcdef, abc123
    • $ - end of a string
      • abc$ => abc, llabc, 456abc
    • . - any symbol (except a new line)
      • a.c => abc, aaa, a2c
    • * - null or more of the preceding character
      • ab*c => ac, abc, abbbbc
    • + - one or more of the preceding characters
      • ab+c => abc, abbbc
    • ? null or one of the preceding character
      • ab?c => ac, abc
    • \ - escape symbol
    • {..} - explicit quantity of preceding character
      • {m,n} - from m to n occurencies
      • {m} - exactly m occurencies
        • ab{2}c => abbc
    • [...] - explicit set of characters to match
      • [A-Z] - symbols range
        • ^[a-c] => axxx, bxx, cxx
      • [xyz] - one of
      • [^xyz] - not one of
    • (...) - group of characters
      • (123){3} => 123123123
  6. The above table describes the difference between BRE \ ERE an PRE
Name BRE and ERE PRE
any digit [[:digit:]] \d
new line - \n
tab - \t
carriage return - \r
space,tab,new line,cariage return - \s
not space,tab, new line, carriage return - \S

grep

  1. Search lines which match pattern
  2. It’s best practise to use ’‘ around regex to prevent shell globbing
  3. Set regexp version (default is BRE)
    • grep -E - use Extended Regular Expression
    • grep -G - use Basic Regular Expression
    • grep -P - use Perl Regular Expressions
  4. Вывод строк совпадающих с шаблоном
    • Поиск по одному символу
        $ cat names
        Tania
        Laura
        Valentina
      
        $ grep u names
        Laura
      
    • Поиск по группе символов
        $ grep ia names
        Tania
      
    • Один из двух символов ```bash $ grep ‘[LT]’ names

      $ grep ‘[0-9]’ names

    • to not match
        $ grep '[^0-9]' names
      
    • or condition

      $ grep -E ‘L|T’ names Laura Tania

      $ grep ‘L|T’ names Laura Tania ```

  5. Совпадение одного или нескольких символов
    • * - соответствует 0, одному или большему количеству вхождений предыдущего симола.
        $ cat list2
        ll
        lol
        lool
        loool
        $ grep -E 'o*' list2
        ll
        lol
        lool
        loool
      
    • + - соответствует одному или большему количеству вхождений предыдущего символа

        $ grep -E 'o+' list2
        lol
        lool
        loool
      
  6. Совпадение начала\конца строки
    • $ - совпадение в конце строки
        $ cat names
        Tania
        Laura
        Valentina
        Fleur
        Floor
      
        $ grep 'a$' names
        Tania
        Laura
        Valentina
        $ grep 'r$' names
        Fleur
        Floor
      
    • ^ - совпадение в начале строки
        $ grep '^Val' names
        Valentina
        $ grep '^F' names
        Fleur
        Floor
      
  7. Разделение слов
    • \b - используется как разделитель слов при поиске

        $ cat text
        The governer is governing.
        The winter is over.
        Can you get over there?
      
        $ grep '\bover\b' text
        The winter is over.
        Can you get over there?
      
    • -w - поиск по словам

        $ grep -w over text
        The winter is over.
        Can you get over there?
      
  8. Обратная ссылка: \(..\) \1
     grep '\([a-z]\)\1' # finds all words with two similar characters
    
  9. Предотвращение раскрытия регулярного выражения командной оболочкой. Т.к. символ доллара является специальным символом, то рекомендуется экранировать регулярные выражения
     $ grep 'r$' names
     Fleur
     Floor
    

sed

  1. Редактор потока данных (stream editor) или, для краткости, утилита sed, использует регулярные выражения для модификации потока данных.
  2. Замена строки
     $ echo Понедельник | sed 's/Понедель/Втор/'
     Вторник
    
  3. Слэши могут быть заменены на некоторые другие символы, которые могут оказаться более удобными и повысить читаемость команды в ряде случаев.
     $ echo Понедельник | sed 's:Понедель:Втор:'
     Вторник
     $ echo Понедельник | sed 's_Понедель_Втор_'
     Вторник
     $ echo Понедельник | sed 's|Понедель|Втор|'
     Вторник
    
  4. sed -i интерактивная обработка файлов (т.е. изменения содержимого файла)
     $ echo Понедельник > today
     $ cat today
     Понедельник
     $ sed -i 's/Понедель/Втор/' today
     $ cat today
     Вторник
    
  5. . - любой символ
     $ echo 2014-04-01 | sed 's/....-..-../YYYY-MM-DD/'
     YYYY-MM-DD
    
  6. \s - используется на ссылку на пробел и табуляцию
     $ echo -e 'сегодня\tтеплый\tдень'
     сегодня	теплый	день
     $ echo -e 'сегодня\tтеплый\tдень' | sed 's_\s_ _g'
     сегодня теплый день
    
  7. ? - необязательный символ
     $ cat list2
     ll
     lol
     lool
     loool
     $ grep -E 'ooo?' list2
     lool
     loool
     $ cat list2 | sed 's/ooo\?/A/'
     ll
     lol
     lAl
     lAl
    
  8. ровно n повторение
     $ cat list2
     ll
     lol
     lool
     loool
     $ grep -E 'o{3}' list2
     loool
     $ cat list2 | sed 's/o\{3\}/A/'
     ll
     lol
     lool
     lAl
    
  9. от n до m повторений
     $ cat list2
     ll
     lol
     lool
     loool
     $ grep -E 'o{2,3}' list2
     lool
     loool
     $ grep 'o\{2,3\}' list2
     lool
     loool
     $ cat list2 | sed 's/o\{2,3\}/A/'
     ll
     lol
     lAl
     lAl
    
  10. Обратные ссылки - круглые скобки используются для группировки частей регулярного выражения, на которые впоследствии могут быть установлены ссылки.
     $ echo Sunday | sed 's_\(Sun\)_\1ny_'
     Sunnyday
     $ echo Sunday | sed 's_\(Sun\)_\1ny \1_'
     Sunny Sunday
    
  11. Множественные обратные ссылки - в случае использования более чем одной пары круглых скобок, ссылка на каждую из них может быть осуществлена путем использования последовательных числовых значений. ```bash $ echo 2014-04-01 | sed ‘s/(….)-(..)-(..)/\1+\2+\3/’ 2014+04+01 $ echo 2014-04-01 | sed ‘s/(….)-(..)-(..)/\3:\2:\1/’ 01:04:2014

awk

  1. Tutorial (rus)
  2. Print column
     awk -F: '{print $1}' /etc/passwd
    

rename

  1. Осуществляет переименование файлов по шаблону
  2. Реализация утилиты rename отличается между дистрибутивами Debian и Red Hat
  3. 's/to_replace_regex/replace_value/Поиск и переименование файлов по шаблону:

     $ ls
     abc       allfiles.TXT  bllfiles.TXT  Scratch   tennis2.TXT
     abc.conf  backup        cllfiles.TXT  temp.TXT  tennis.TXT
     $ rename 's/TXT/text/' *
     $ ls
     abc       allfiles.text  bllfiles.text  Scratch    tennis2.text
     abc.conf  backup         cllfiles.text  temp.text  tennis.text
    
  4. 's/regex/str/g - замена всех вхожденй строки
     $ touch aTXT.TXT
     $ rename -n 's/TXT/txt/g' aTXT.TXT
     aTXT.TXT renamed as atxt.txt
    
  5. 's/regex/str/i - замена без учета регистра
     $ ls
     file1.text  file2.TEXT  file3.txt
     $ rename 's/.text/.txt/i' *
     $ ls
     file1.txt  file2.txt  file3.txt
    
  6. Изменение расширений
     $ ls *.txt
     allfiles.txt  bllfiles.txt  cllfiles.txt  really.txt.txt  temp.txt  tennis.txt
     $ rename 's/.txt$/.TXT/' *.txt
     $ ls *.TXT
     allfiles.TXT  bllfiles.TXT    cllfiles.TXT    really.txt.TXT
     temp.TXT      tennis.TXT
    

Usefull utilities

  1. cat - copy data from stdin to stdout.
    • cat file1 file2 file3 - concatenates 3 files
    • create a file with content (stop - here is a special marker of end of input - we could specify any word, most common is EOF)
        cat > hot.txt <<stop
        some string
        stop
      
    • copy file1 to file2
        cat file1 > file2
      
    • при размещении фильтра cat между двумя программными каналами не будет осуществляться какой-либо обработки передающихся через них данных.
        $ tac count.txt | cat | cat | cat | cat | cat
        три
        два
        один
      
  2. tee - перемещает данные из стандартного потока ввода stdin в стандартный поток вывода stdout, а также записывает их в файл.

     $ tac count.txt | tee temp.txt | tac
     один
     два
     три
     $ cat temp.txt
     три
     два
     один
    
  3. cut - извлекает данные из столбцов расположенных в файлах таблиц с указанием разделителя столбцов или количества байт данных в столбцах. Чаще всего используется для того чтобы убрать делимитер

    • разделить строку по двоеточию и вывести 1 и 3 столбцы
        cut -d: -f1,3 /etc/passwd | tail -4
      
    • разделить строку по пробелам
        cut -d" " -f1 file.txt
      
  4. tr - преобразование символов в потоке

    • заменить символ в строке
        cat tennis.txt | tr 'e' 'E'
      
    • -d - удалить символ
        cat tennis.txt | tr -d e
      
    • заменить последовательность символов
        cat tennis.txt | tr 'a-z' 'A-Z'
      
  5. wc - подсчитывает строки, слова и символы
  6. sort - сортирует строки

    • сортировка строк
        sort music.txt
      
    • -k - сортировка строк по 1 столбцу
        sort -k1 country.txt
      
    • -n - числовая сортировка
        $ sort -k3 country.txt
        Belgium, Brussels, 10
        Germany, Berlin, 100
        Italy, Rome, 50
        France, Paris, 60
      
        Iran, Teheran, 70
        $ sort -n -k3 country.txt
        Belgium, Brussels, 10
        Italy, Rome, 50
        France, Paris, 60
        Iran, Teheran, 70
        Germany, Berlin, 100
      
  7. uniq - отфильтровывает повторяющиеся строки
  8. head - get first 10 lines of file
    • head -4 - get first 4 files of file
    • head -4c - get first 4 bytes of file
  9. tail - get last 10 lines of file
    • tail -4 - get last 4 files of file
    • tail -4c - get last 4 bytes of file
  10. less get file content and format it into multiple pages (use space to navigate between them).
  11. tac - print file with reversed string order
     $ tac count.txt
     три
     два
     один
    
  12. fmt - formats text