Текстови потоци и филтри

 

1.       Въведение. 1

2.       Редове. 1

3.       Броене на думи и линии с wc. 1

4.       Извеждане на файл с less. 1

5.       Сортиране на линии с sort 1

6.       Премахване на повтарящи се линии с uniq. 1

7.       Избор на част от реда с cut 1

8.       Заместване на табулации с интервали. 1

9.       Форматиране на текстови файлове с fmt 1

10.         Извеждане началото на файл с head. 1

11.         Извеждане края на файл с tail 1

12.         Извеждане в осмична или шестнадесетична система на бинарни данни

13       Смяна на Character Encoding на текстов файл с iconv. 1

 

 

     1.     Въведение

Филтрите са широко използвани в Unix/Linux, както за обработка на изхода от различни команди, така и за обработка на конфигурационни файлове.. Те са команди, които взимат текстов поток за вход, извършват някаква обработка и извеждат  обработения резултат.  Много често се използват в конвейер за получаване на четим резултат от команди.

Unix/Linux системите предлагат много удобства за обработка на текстови потоци.

Повечето конфигурационни файлове са обикновен текст (ASCII).

За използване на други символи трябва да се използва стандарта ISO-8859. Все още твърде малко командни интерпретатори поддържат директно Unicode.


     2.     Редове

Текстовите файлове се състоят от редове. Всеки ред завършва с „line feed“ (код 10, или шестнадесетичен 0x0A).

Други ОС използват други символи за край на ред

Windows (и DOS) – carriage return“(код 13) последван от  line feed

MAC – само „carriage return

Има програми за конвертиране между различните формати

     3.     Броене на думи и линии с wc

Формат: wc [OPTIONS]  [FILE]

Командата wc брои редовете, думите и символите  в текстови файл.  Ако се използва с няколко файла, броенето се извършва поотделно и общо.

Опции:

·        -c извежда броя на преброените символи - резултат в две колони (броя на символите и името на файла)

·        -l извежда броя на преброените редове - резултат в две колони (броя на редовете и името на файла)

·        -w извежда броя на преброените думи - резултат в две колони (броя на думите и името на файла)

·       по подразбиране (ако не са зададени опции) -lwc  - резултат в 4 колони (броя на редовете, думите, символите и името на файла)

·       ползва стандартният вход ако не е зададен файл или файлът е зададен с - 

Примери:

·        броя на думите в essay.txt:

$ wc -w essay.txt

·        броя на редовете във всички текстови файлове в текущата директория:

$ wc -l *.txt

     4.     Извеждане на файл с less

Ако файлът е прекалено голям за да се помести на терминала е удобно извеждането му да става с less. Командата изчиства терминала, което е удобно и при малки файлове.

Синтаксис :    less [options] file_path

Някой опции:

 -N  извежда номерата на линиите във файла

+F показва края на файла и следи за дообавени линии във файла направени от друг процес  (подобно действие като команда tail -f ).

Някои интерактивни команди при изпълнение на less:

Command Action
Down arrow, Enter, e, or j Move forward one line.
Up arrow,y or k Move backward one line.
Space bar or f Move Forward one page.
b Move Backward one page.
/pattern Search  for matching patterns.
n Repeat previous search.
g Go to the first line in the file.
Ng Go to the N-th line in the file.
G Go to the last line in the file.
p Go to the beginning of the file.
Np Go to N percent into file.
h Display help.
q Exit less.

Примери:

$ less -N /var/log/auth.log

Често се използва в края на конвейери, особено когато не е ясно колко дълъг ще е изхода. Следващата команда извежда информация за всички файлове (които не са директории ) от директорията /bin с номерата на линиите:

$ ls -l /bin/* |egrep ^- |less -N

За да се илюстрира опцият +F нека да бъде създаден файл test.txt, след което да се следи за добавянето на нови линии в края на файла:

$ cat > test.txt
first orig line
sec orig line

$less  +F test.txt

Във втори CLI се добавят нови линии във файла:

$ cat >> test.txt
first added line
Second added line

Допълнителна информация за опциите и интерактивните команди може да се види с:

$ less -?

За разлика от командата cat специалните символи във файла не могат да объркат терминала.

     5.     Сортиране на линии с sort

Командата sort чете текстови редове и ги извежда подредени

Синтаксис:

sort [OPTION]... [FILE]...

Правилата за лексикографическо подреждане са

·        редовете започващи с цифра са преди редовете започващи с буква;

·        редовете започващи с буква по-напред в азбуката са пред редовете започващи с буква по-назад

·        редовете започващи с главна буква са преди тези със съответната малка

Тези правила за сортиране могат да бъдат променени от опциите.

Пример:

$ cat > phonebook

Smith, Brett     555-4321

Doe, John        555-1234

Fogarty, Suzie   555-2314

Doe, Jane        555-3214

Avery, Cory      555-4132

Fogarty, Suzie   555-2314

 

$ sort phonebook

Avery, Cory      555-4132

Doe, Jane        555-3214

Doe, John        555-1234

Fogarty, Suzie   555-2314

Fogarty, Suzie   555-2314

Smith, Brett     555-4321

Опцията -u извежда само уникалните ( не повтарящи се)  линии:

$ sort -u phonebook

Avery, Cory      555-4132

Doe, Jane        555-3214

Doe, John        555-1234

Fogarty, Suzie   555-2314

Smith, Brett     555-4321

Акo трябва да се запише във файл се използва пренасочване на изхода:

$ sort phonebook > sorted-phonebook

Опцията  -f  прави сортирането да не прави разлика между главни и малки букви

Опцията -n сортира по числови стойности (без него се разглеждат като низове от символи).

Например командата du извежда по редове размера на файловете и името на файла, така че за извеждането на файловете подредени по размер:

$ du /bin/* |less

$ du /bin/* | sort -n |less

$ du /bin/* | sort  |less


     6.     Премахване на повтарящи се линии с uniq

Командата  се използва за премахване на последователни повтарящи се редове.

Ако се използва със сортиране се премахват всички дублиращи се редове. Например, ако се търси броя на различните думи:

$ sort phonebook | uniq | wc -w

Командата sort има -u опция за извършване на същото без отделна програма :

Но sort | uniq има повече възможности :

 uniq -c брои  появяванията на всеки ред

$ sort phonebook | uniq -c

uniq -u извежда  само уникалните линии

$ sort phonebook | uniq -u

uniq –d извежда само повтарящите се редове.

$ sort phonebook | uniq -cd

     7.     Избор на част от реда с cut

Използва се за избиране на колони или полета от ред

Опции за избор на

·        символи  -c;

·        полета  -f;

·        задаване на разделител с -d (по подразбиране е tab).

Обхвата се задава с начална и крайна позиция например  3-5; или изброява със запетайка 3,4 или само с една позиция 3, след опцията за символи или полета.

Първият символ е номериран 1 не 0.

Примери:

$cat > names.csv

John,Smith,34,London

Arthur,Evans,21,Newport

George,Jones,32,Truro

Втори символ във всеки ред

$ cut  -c 2 names.csv

22 символ във всеки ред ( в първия и третия няма такъв)

$ cut  -c 22 names.csv

Разделител запетая  като се взима първо поле

$ cut -d ',' -f 1 names.csv

John

Arthur 

George

Взимат се първото и четвъртото поле

$cut -d ',' -f 1,4 names.csv

John,London

Arthur,Newport

George,Truro

Извеждане на имената на работещите в момента потребители (опция –u еднократно):

$ who | cut -d" " -f1 | sort -u

     8.     Заместване на табулации с интервали

Командата expand копира файла (или  стандартния вход) към стандартния изход, с табулации заменени с празни интервали.

Размерът на табулацията се задава с опция –t, като подразбиращата се опция е 8.

Опцията –i  сменя само табулациите в началото на редовете.

Пример - да се сменят табулациитe от stdin с един празен интервал и резултата да се запише в foo.txt

$ expand -t 1 > foo.txt

     9.     Форматиране на текстови файлове с fmt

Командата преформатира файлът (файловете) като записва изхода на системния изход.

Опцията -u оставя един празен интервал между думите и две между изреченията.

Опцията –w задава максималният брой символи на линия.

Пример

$ fmt -w 70 notes.txt | less

   10.   Извеждане началото на файл с head

Извежда на изхода началото на входа си и игнорира останалото.

Указва броя на редовете с -n lines или –lines (по подразбиране 10)

Пример: да се изведе headers на HTML страница с име homepage.html

$ head homepage.html

Да се изведе първия ред на текстов файл (две алтернативи):

$ head -n 1 notes.txt

$ head -1 notes.txt

   11.   Извеждане края на файл с tail

Команда подобна на head но извежда редовете в края на файла. Опцията –се използва по същия начин.

Опцията –f позволява непрекъснато следене на файла (прекратява се с Ctrl+C)

Примери:

$tail myfile.txt

извежда последните 10 реда от файла myfile.txt.

 

$ tail myfile.txt -n 100

извежда последните 100 реда от файла myfile.txt.

 

$ tail -f myfile.txt

Извежда последните 10 реда от файла myfile.txt и продължава да го следи, като извежда всеки добавен в него ред.

   12.   Извеждане в осмична или шестнадесетична система на бинарни данни

Командата od (octal dump) извежда числовите стойности на байтовете на файл. По подразбиране извежда в осмична система дву-байтови думи.

Алтернативите се специфицират с –t

·        с буква за основата на бройната система: o за 8-мична, x за 16-тична, u за без знаково 10-тично число

·        може да бъде последван от броя на байтове за дума

·        z за добавяне на ASCII представянето на извежданото число

·        полезен формат е od -t x1z — hexadecimal, one byte words, with ASCII

$ cat > test.txt
word1 word2
    word3
word4

$ od -t x1z test.txt
0000000 77 6f 72 64 31 20 77 6f 72 64 32 0a 20 20 20 20  >word1 word2.    <
0000020 77 6f 72 64 33 0a 77 6f 72 64 34 0a              >word3.word4.<
0000034

Алтернативи на командата са командите xxd и hexdump

13.   Смяна на Character Encoding на текстов файл с iconv

Понякога се налага да бъде сменено кодирането на символите в текстов файл.  

Синтаксис

$ iconv -f encoding -t encoding inputfile

Командата  iconv преобразува кодирането на символите в inputfile. Резултатът се записва в стандартния изходен файл (stdout) освен ако не е специфицирана  --output опция. Ако няма inputfile, то информацията се очаква на стандартния вход (stdin).

Опции:
--from-code, -f encoding - преобразува кодирането от  encoding

--to-code, -t encoding  - преобразува кодирането към encoding

--list, -l  - извежда известните coded character sets

--output, -o file   - специфицира файл с преобразувано кодиране (вместо на стандартния изход)

--verbose - извежда допълнителна информация
.

Например за да бъде преобразуван файл от WINDOWS-1251 в  UTF-8 :

$ iconv -f WINDOWS-1251 -t UTF-8 -o output_file.txt original_file.txt 

Забележка:

$ echo abc ß ? € à?ç | iconv -f UTF-8 -t ASCII//TRANSLIT
abc ss ? EUR a?c

$echo abc ß ? € à?ç | iconv -f UTF-8 -t ASCII//IGNORE
abc  ?  ?
iconv: illegal input sequence at position 19

$echo abc ß ? € à?ç |od -t x1z
0000000 61 62 63 20 c3 9f 20 3f 20 e2 82 ac 20 c3 a0 3f  >abc .. ? ... ..?<
0000020 c3 a7 0a                                         >...<
0000023

За извежда известните coded character sets

$ iconv  -l