Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
spo_voprosy.docx
Скачиваний:
9
Добавлен:
20.03.2016
Размер:
465.35 Кб
Скачать

Глава 16. Фильтры.

Команды, которые созданы для использования с пайпами, часто называют фильтрами. Фильтры - это небольшие программы, которые делают одну конкретную вещь достаточно эффективно. Они могут быть использованы в качестве строительных блоков. Эта глава познакомит вас с наиболее распространенными фильтрами. Сочетание простых команд и фильтров в длинном пайпе позволяет получить лучшее решение.

16.1 Cat

Когда команда catнаходится между двумя пайпами, она не делает ничего, кроме передачи потока стандартного ввода на стандартный вывод).

[paul@RHEL4b pipes]$ tac count.txt | cat | cat | cat | cat | cat

five

four

three

two

one

[paul@RHEL4b pipes]$

16.2 tee

Написания длинных пайпов в Unix это забавно, но иногда возникает необходимость в промежуточных результатов. Для этого нам пригодится фильтр tee. Фильтрteeставит поток стандартного ввода на стандартный вывод, а также в файл. Таким образом, командаteeпочти такая же, как иcat, за исключением того, что она имеет два одинаковых выхода.

[paul@RHEL4b pipes]$ tac count.txt | tee temp.txt | tac

one

two

three

four

five

[paul@RHEL4b pipes]$ cat temp.txt

five

four

three

two

one

[paul@RHEL4b pipes]$

16.3 Grep

Фильтр grepявляется довольно известным среди пользователейUnix. Наиболее распространенное использование фильтраgrep,является фильтрация строк текста, содержащего (или не содержащего) определенную строку.

[paul@RHEL4b pipes]$ cat tennis.txt

Amelie Mauresmo, Fra

Kim Clijsters, BEL

Justine Henin, Bel

Serena Williams, usa

Venus Williams, USA

[paul@RHEL4b pipes]$ cat tennis.txt | grep Williams

Serena Williams, usa

Venus Williams, USA

Вы можете написать этот фильтр без фильтра cat.

[paul@RHEL4b pipes]$ grep Williams tennis.txt

Serena Williams, usa

Venus Williams, USA

Одним из самых полезных вариантов фильтра является grep -i, который фильтрует, несмотря на регистр.

[paul@RHEL4b pipes]$ grep Bel tennis.txt

Justine Henin, Bel

[paul@RHEL4b pipes]$ grep -i Bel tennis.txt

Kim Clijsters, BEL

Justine Henin, Bel

[paul@RHEL4b pipes]$

Другая очень полезная опция grep -v, которая выводит строки, не удовлетворяющие введенной строке.

[paul@RHEL4b pipes]$ grep -v Fra tennis.txt

Kim Clijsters, BEL

Justine Henin, Bel

Serena Williams, usa

Venus Williams, USA

[paul@RHEL4b pipes]$

И, конечно, оба варианта могут быть объединены, чтобы отфильтровать все строки, не содержащие введенные строки и без учета регистра.

[paul@RHEL4b pipes]$ grep -vi usa tennis.txt

Amelie Mauresmo, Fra

Kim Clijsters, BEL

Justine Henin, Bel

[paul@RHEL4b pipes]$

С grepA1на экран также выводится одна строка, которая идетпослестроки, в которой содержится исходный запрос.

paul@debian5:~/pipes$ grep -A1 Henin tennis.txt

Justine Henin, Bel

Serena Williams, usa

С grepB1на экран выводится одна строка, которая идетдостроки, в которой содержится исходный запрос.

paul@debian5:~/pipes$ grep -B1 Henin tennis.txt

Kim Clijsters, BEL

Justine Henin, Bel

С grepC1на экран выводится одна строка, которая идетдо и послестроки, в которой содержится исходный запрос. Все эти три опции (A,BиC) могут показывать любое количество строк (например,A2,B4 илиC20)

paul@debian5:~/pipes$ grep -C1 Henin tennis.txt

Kim Clijsters, BEL

Justine Henin, Bel

Serena Williams, usa

16.4 cut

Фильтр cut может выбирать столбцы из файлов, в зависимости от разделителя (т.е. например, если в файле слова написаны через :, и задать в качестве разделителя пробел, то «столбец» в каждой строке будет только один) или количества байт. На примере ниже, фильтрcutиспользуют, чтобы разделить имя пользователя иidпользователя в файле/etc/passwd. Используется двоеточие в качестве разделителя, и выбираются поля 1 и 3.

[[paul@RHEL4b pipes]$ cut -d: -f1,3 /etc/passwd | tail -4

Figo:510

Pfaff:511

Harry:516

Hermione:517

[paul@RHEL4b pipes]$

При использовании пробела в качестве разделителя для cut, вы должны взять его в “ “ кавычки.

[paul@RHEL4b pipes]$ cut -d" " -f1 tennis.txt

Amelie

Kim

Justine

Serena

Venus

[paul@RHEL4b pipes]$

В этом примере cutиспользуется для отображения со второго по седьмой символ/etc/passwd.

[paul@RHEL4b pipes]$ cut -c2-7 /etc/passwd | tail -4

igo:x:

faff:x

arry:x

ermion

[paul@RHEL4b pipes]$

16.5. tr

Вы можете заменять символы с помощью фильтра tr. На скриншоте видно замену всех “е” на “E”.

[paul@RHEL4b pipes]$ cat tennis.txt | tr 'e' 'E'

AmEliE MaurEsmo, Fra

Kim ClijstErs, BEL

JustinE HEnin, BEl

SErEna Williams, usa

VEnus Williams, USA

Здесь мы заменяем все строчные буквы на заглавные с помощью определения двух диапазонов.

[paul@RHEL4b pipes]$ cat tennis.txt | tr 'a-z' 'A-Z'

AMELIE MAURESMO, FRA

KIM CLIJSTERS, BEL

JUSTINE HENIN, BEL

SERENA WILLIAMS, USA

VENUS WILLIAMS, USA

[paul@RHEL4b pipes]$

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

[paul@RHEL4b pipes]$ cat count.txt

one

two

three

four

five

[paul@RHEL4b pipes]$ cat count.txt | tr '\n' ' '

one two three four five [paul@RHEL4b pipes]$

Фильтр tr -sможно использовать, чтобы заменить несколько одинаковых символов на один.

[paul@RHEL4b pipes]$ cat spaces.txt

one two three

four five six

[paul@RHEL4b pipes]$ cat spaces.txt | tr -s ' '

one two three

four five six

[paul@RHEL4b pipes]$

Вы также можете использовать tr, чтобы "шифровать" тексты с помощьюrot13.

[paul@RHEL4b pipes]$ cat count.txt | tr 'a-z' 'nopqrstuvwxyzabcdefghijklm'

bar

gjb

guerr

sbhe

svir

[paul@RHEL4b pipes]$ cat count.txt | tr 'a-z' 'n-za-m'

bar

gjb

guerr

sbhe

svir

[paul@RHEL4b pipes]$

В этом последнем примере мы используем tr -dдля удаления символов.

paul@debian5:~/pipes$ cat tennis.txt | tr -d e

Amli Maursmo, Fra

Kim Clijstrs, BEL

Justin Hnin, Bl

Srna Williams, usa

Vnus Williams, USA

16.6. wc

Посчитать количество слов, строк и символов довольно легко с фильтром wc.

[paul@RHEL4b pipes]$ wc tennis.txt

5 15 100 tennis.txt

[paul@RHEL4b pipes]$ wc -l tennis.txt

5 tennis.txt

[paul@RHEL4b pipes]$ wc -w tennis.txt

15 tennis.txt

[paul@RHEL4b pipes]$ wc -c tennis.txt

100 tennis.txt

[paul@RHEL4b pipes]$

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]