Текстови потоци и филтри
3. Броене на думи и линии с wc
6. Премахване на повтарящи се линии с uniq
7. Избор на част от реда с cut
8. Заместване на табулации с интервали
9. Форматиране на текстови файлове с fmt
10. Извеждане началото на файл с head
11. Извеждане края на файл с tail
12. Извеждане в осмична или шестнадесетична система на бинарни данни
13 Смяна на Character Encoding на текстов файл с iconv
Филтрите са широко използвани в Unix/Linux, както за обработка на изхода от различни команди, така и за обработка на конфигурационни файлове.. Те са команди, които взимат текстов поток за вход, извършват някаква обработка и извеждат обработения резултат. Много често се използват в конвейер за получаване на четим резултат от команди.
Unix/Linux системите предлагат много удобства за обработка на текстови потоци.
Повечето конфигурационни файлове са обикновен текст (ASCII).
За използване на други символи трябва да се използва стандарта ISO-8859. Все още твърде малко командни интерпретатори поддържат директно Unicode.
Текстовите файлове се състоят от редове. Всеки ред завършва с „line feed“ (код 10, или шестнадесетичен 0x0A).
Други ОС използват други символи за край на ред
Windows (и DOS) – „carriage return“(код 13) последван от „line feed“
MAC – само „carriage return“
Има програми за конвертиране между различните формати
Формат: wc [OPTIONS] [FILE]
Командата wc брои редовете, думите и символите в текстови файл. Ако се използва с няколко файла, броенето се извършва поотделно и общо.
Опции:
· -c извежда броя на преброените символи - резултат в две колони (броя на символите и името на файла)
· -l извежда броя на преброените редове - резултат в две колони (броя на редовете и името на файла)
· -w извежда броя на преброените думи - резултат в две колони (броя на думите и името на файла)
· по подразбиране (ако не са зададени опции) -lwc - резултат в 4 колони (броя на редовете, думите, символите и името на файла)
· ползва стандартният вход ако не е зададен файл или файлът е зададен с -
Примери:
· броя на думите в essay.txt:
$ wc -w essay.txt
· броя на редовете във всички текстови файлове в текущата директория:
$ wc -l *.txt
Ако файлът е прекалено голям за да се помести на терминала е удобно извеждането му да става с 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 специалните символи във файла не могат да объркат терминала.
Командата 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
Командата се използва за премахване на последователни повтарящи се редове.
Ако се използва със сортиране се премахват всички дублиращи се редове. Например, ако се търси броя на различните думи:
$ 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
Използва се за избиране на колони или полета от ред
Опции за избор на
· символи -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
Командата expand копира файла (или стандартния вход) към стандартния изход, с табулации заменени с празни интервали.
Размерът на табулацията се задава с опция –t, като подразбиращата се опция е 8.
Опцията –i сменя само табулациите в началото на редовете.
Пример - да се сменят табулациитe от stdin с един празен интервал и резултата да се запише в foo.txt
$ expand -t 1 > foo.txt
Командата преформатира файлът (файловете) като записва изхода на системния изход.
Опцията -u оставя един празен интервал между думите и две между изреченията.
Опцията –w задава максималният брой символи на линия.
Пример
$ fmt -w 70 notes.txt | less
Извежда на изхода началото на входа си и игнорира останалото.
Указва броя на редовете с -n lines или –lines (по подразбиране 10)
Пример: да се изведе headers на HTML страница с име homepage.html
$ head homepage.html
Да се изведе първия ред на текстов файл (две алтернативи):
$ head -n 1 notes.txt
$ head -1 notes.txt
Команда подобна на head но извежда редовете в края на файла. Опцията –n се използва по същия начин.
Опцията –f позволява непрекъснато следене на файла (прекратява се с Ctrl+C)
Примери:
$tail myfile.txt
извежда последните 10 реда от файла myfile.txt.
$ tail myfile.txt -n 100
извежда последните 100 реда от файла myfile.txt.
$ tail -f myfile.txt
Извежда последните 10 реда от файла myfile.txt и продължава да го следи, като извежда всеки добавен в него ред.
Командата 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
Понякога се налага да бъде сменено кодирането на символите в текстов файл.
Синтаксис
$ 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