<
  • Главная
Статьи

Команди обробки тексту

sort

Сортує вміст файлу, часто використовується як проміжний фільтр в конвеєрах. Ця команда сортує потік тексту в порядку зменшення чи збільшення, в залежності від заданих опцій. Ключ -m використовується для сортування та об'єднання вхідних файлів. В сторінці info перераховано велика кількість можливих варіантів ключів. Див. приклад 10-9 , приклад 10-10 і Приклад A-9 .

tsort

Топологічна сортування, зчитує пари рядків, розділених пробільними символами, і виконує сортування, в залежності від заданого шаблону.

uniq

Видаляє повторювані рядки з відсортованого файлу. Цю команду часто можна зустріти в конвеєрі з командою sort .

cat list-1 list-2 list-3 | sort | uniq> final.list # Вміст файлів, # сортується, # потім видаляються повторювані рядки, # і результат записується в вихідний файл.

Ключ -c виводить кількість повторюваних рядків.

bash $ cat testfile Цей рядок зустрічається тільки один раз. Цей рядок зустрічається двічі. Цей рядок зустрічається двічі. Цей рядок зустрічається тричі. Цей рядок зустрічається тричі. Цей рядок зустрічається тричі. bash $ uniq -c testfile 1 Цей рядок зустрічається тільки один раз. 2 Цей рядок зустрічається двічі. 3 Цей рядок зустрічається тричі. bash $ sort testfile | uniq -c | sort -nr 3 Цей рядок зустрічається тричі. 2 Цей рядок зустрічається двічі. 1 Цей рядок зустрічається тільки один раз.

Команда sort INPUTFILE | uniq -c | sort -nr виводить статистику зустрічальності рядків у файлі INPUTFILE (ключ -nr, в команді sort, означає сортування в порядку убування). Цей шаблон може з успіхом використовуватися при аналізі файлів системного журналу, словників і всюди, де необхідно проаналізувати лексичну структуру документа.

Приклад 12-8. Частота народження окремих слів

#! / Bin / bash # wf.sh: "Сирий" аналіз частоти виникнення слова в текстовому файлі. ARGS = 1 E_BADARGS = 65 E_NOFILE = 66 if [$ # -ne "$ ARGS"] # Файл для аналізу заданий? then echo "Порядок використання:` basename $ 0` filename "exit $ E_BADARGS fi if [! -f "$ 1"] # Перевірка існування файлу. then echo "Файл \" $ 1 \ "не найден." exit $ E_NOFILE fi ############################################## ########## # main () sed -e 's /\.// g' -e 's / / \ / g' "$ 1" | tr 'AZ' 'az' | sort | uniq -c | sort -nr # ========================= # Підрахунок кількості входжень # Точки і прогалини замінюються # + символами переведення рядка, # + потім символи переводяться в нижній регістр # + і нарешті підраховується кількість входжень, # + і виконується сортування по числу входжень. ################################################## ###### # Вправи: # --------- # 1) Додайте команду 'sed' для відсікання інших знаків пунктуації, наприклад, ком. # 2) Додайте видалення зайвих пробілів і інших символів пробілів. # 3) Додайте додаткову сортування так, щоб слова з однаковою частотою зустрічається # + сортувалися б в алфавітному порядку. exit 0 bash $ cat testfile Цей рядок зустрічається тільки один раз. Цей рядок зустрічається двічі. Цей рядок зустрічається двічі. Цей рядок зустрічається тричі. Цей рядок зустрічається тричі. Цей рядок зустрічається тричі. bash $ ./wf.sh testfile 6 Ця 6 зустрічається 6 рядок 3 тричі 2 двічі 1 тільки 1 один 1 раз
expand, unexpand

Команда expand перетворює символи табуляції в пропуски. Часто використовується в конвеєрній обробці тексту.

Команда unexpand перетворює прогалини в символи табуляції. Тобто вона є зворотною по відношенню до команди expand.

cut

Призначена для вилучення окремих полів з текстових файлів. Нагадує команду print $ N в awk , Але більш обмежена в своїх можливостях. У найпростіших випадках може бути непоганою заміною awk в сценаріях. Особливу значущість, для команди cut, представляють ключі -d (роздільник полів) і -f (номер (а) поля (їй)).

Використання команди cut для отримання списку змонтованих файлових систем:

cat / etc / mtab | cut -d '' -f1,2

Використання команди cut для отримання версії ОС і ядра:

uname -a | cut -d "" -f1,3,11,12

Використання команди cut для вилучення заголовків повідомлень з електронних листів:

bash $ grep '^ Subject:' read-messages | cut -c10-80 Re: Linux suitable for mission-critical apps? MAKE MILLIONS WORKING AT HOME3 Spam complaint Re: Spam complaint

Використання команди cut при розборі текстового файлу:

# Список користувачів в / etc / passwd. FILENAME = / etc / passwd for user in $ (cut -d: -f1 $ FILENAME) do echo $ user done # спсибо Oleg Philon за цей приклад.

cut -d '' -f2,3 filename еквівалентно awk -F '[]' '{print $ 2, $ 3}' filename

Див. також приклад 12-33 .

paste

Використовується для об'єднання декількох файлів в один Багатоколоночних файл.

join

Може розглядатися як команда, споріднена команді paste. Ця потужна утиліта дозволяє об'єднувати два файли за загальним полю, що є спрощеною версією реляційної бази даних.

Команда join оперує тільки двома файлами і об'едіяет тільки ті рядки, які мають загальне поле (зазвичай числове), результат об'єднання виводиться на stdout. Об'єднуються файли повинні бути відсортовані за ключовим полем.

File: 1.data 100 Shoes 200 Laces 300 Socks
File: 2.data 100 $ 40.00 200 $ 1.00 300 $ 2.00
bash $ join 1.data 2.data File: 1.data 2.data 100 Shoes $ 40.00 200 Laces $ 1.00 300 Socks $ 2.00

На виході ключове поле зустрічається тільки один раз.

head

Виводить початкові рядки з файлу на stdout (за замовчуванням - 10 рядків, але це число можна задати іншим). Ця команда має ряд цікавих ключів.

Приклад 12-9. Які з файлів є сценаріями?

#! / Bin / bash # script-detector.sh: Шукає файли сценаріїв в каталозі. TESTCHARS = 2 # Перевіряються перші два символи. SHABANG = '#!' # Сценарії як правило починаються з "sha-bang." for file in * # Обхід всіх файлів в каталозі. do if [[ `head -c $ TESTCHARS" $ file "` = "$ SHABANG"]] # head -c2 #! # Ключ '-c' в команді "head" виводить заданий # + кількість символів, а не рядків. then echo "Файл \" $ file \ "- сценарій." else echo "Файл \" $ file \ "не є сценарієм." fi done exit 0

Приклад 12-10. Генератор 10-значних випадкових чисел

#! / Bin / bash # rnd.sh: Генератор 10-значних випадкових чисел # Автор: Stephane Chazelas. head -c4 / dev / urandom | od -N4 -tu4 | sed -ne '1s /.* // p' # ===================================== ============================== # # Опис # -------- # head: # -c4 - перші 4 байта. # Od: # -N4 обмежує висновок 4-ма байтами. # -Tu4 беззнаковий десятковий формат виведення. # Sed: # -n, в комбінації з прапором "p", в команді "s", # виводить тільки збігаються з шаблоном рядки. # Автор сценарію описує дії 'sed' таким чином: # head -c4 / dev / urandom | od -N4 -tu4 | sed -ne '1s /.* // p' # ----------------------------------> | # Передає висновок в "sed" --------> | # Нехай це буде 0000000 1198195154 \ n # sed починає читати символи: 0000000 1198195154 \ n. # Тут він знаходить символ перекладу рядка, # таким чином він отримує рядок (0000000 1198195154). # Потім він переглядає <діапазон> <дію>. Перший і єдиний - це # діапазон дію # 1 s /.* // p # Номер рядка потрапляє в заданий ліапазон, так що тепер він приступає до виконання дії: # намагається замінити найбільшу подстроку, що закінчується пропуском # ( "0000000") " нічим "(//), і якщо заміна зроблена - виводить результат # (" p "- це прапор команди" s ", а не команда" p ", яка має інше значення). # Тепер sed готовий продовжити читання вхідного потоку. (Зверніть увагу: # якщо опустити ключ -n, то sed виведе рядок ще раз) # Тепер sed дочитує залишок рядка. # Він готовий приступити до аналізу 2-го рядка (яка зазначена '$' # як остання). # Оскільки рядок не потрапляє в заданий <діапазон>, на цьому обробка припиняється. # Простіше кажучи, команда sed означає: # "В першому рядку видалити будь-які символи, аж до останнього зустрінутого пробілу, # і потім вивести залишок." # Зробити це можна більш простим способом: # sed -e 's /.* //; q' # Де, задані два <діапазону> <дії> (можна записати і по іншому # sed -e 's /.* // '-eq): # діапазон дію # нічого (для співпадаючих рядків) s /.* // # нічого (для співпадаючих рядків) q (quit) # Тут sed зчитує тільки перший рядок. # Виконує обидві дії, і виводить рядок перед завершенням # (дія "q"), оскільки ключ "-n" опущений. # ================================================= ================== # # Проста альтернатива: # head -c4 / dev / urandom | od -An -tu4 exit 0 Див. також приклад 12-30 .
tail

Виводить останні рядки з файлу на stdout (за замовчуванням - 10 рядків). Зазвичай використовується для моніторингу системних журналів. Ключ -f, дозволяє вести безперервне спостереження за додаються рядками в файл.

Приклад 12-11. Моніторинг системного журналу за допомогою tail

#! / Bin / bash filename = sys.log cat / dev / null> $ filename; echo "Створення / очищення тимчасового файлу." # Якщо файл відсутній, то він створюється, # + і очищається, якщо існує. #:> Filename і> filename дають той же ефект. tail / var / log / messages> $ filename # Файл / var / log / messages повинен бути доступний для читання. echo "В файл $ filename записані останні рядки з / var / log / messages." exit 0

Див. також приклад 12-4 , приклад 12-30 і приклад 29-6 .

grep

Багатоцільова пошукова утиліта, яка використовує Регулярні вирази . Спочатку це була команда в стародавньому строчном редакторі ed, g / re / p, що означає - global - regular expression - print.

grep pattern [file ...]

Пошук ділянок тексту в файлі (ах), відповідних шаблоном pattern, де pattern може бути як звичайною рядком, так і регулярним виразом.
bash $ grep '[rst] ystem. $' osinfo.txt The GPL governs the distribution of the Linux operating system .

Якщо файл (и) для пошуку не заданий, то команда grep працює як фільтр для пристрою stdout, наприклад в конвеєрі .

bash $ ps ax | grep clock 765 tty1 S 0:00 xclock 901 pts / 1 S 0:00 grep clock

-i - виконується пошук без урахування регістру символів.

-w - пошук збігів цілого слова.

-l - висновок тільки імен файлів, в яких знайдені ділянки, що збігаються із заданим зразком / шаблоном, без виведення співпадаючих рядків.

-r - (рекурсивний пошук) пошук виконується в поточному каталозі і всіх вкладених підкаталогах.

The -n option lists the matching lines, together with line numbers.

bash $ grep -n Linux osinfo.txt 2: This is a file containing information about Linux. 6: The GPL governs the distribution of the Linux operating system.

-v (або --invert-match) - виводить тільки рядки, що не містять збігів.

grep pattern1 * .txt | grep -v pattern2 # Виводять рядки з "* .txt", збігаються з "pattern1", # але *** НЕ *** збігаються з "pattern2".

-c (--count) - виводить кількість збігів без виведення самих збігів.

grep -c txt * .sgml # (кількість збігів з "txt" в "* .sgml" файлах) # grep -cz. # ^ Точка # означає підрахунок (-c) непустих ( "." - містять хоча б один символ) елементів, # розділених нульовими байтами (-z) # printf 'ab \ nc d \ n \ n \ n \ n \ n \ 000 \ n \ 000e \ 000 \ 000 \ nf '| grep -cz. # 4 printf 'ab \ nc d \ n \ n \ n \ n \ n \ 000 \ n \ 000e \ 000 \ 000 \ nf' | grep -cz '$' # 5 printf 'ab \ nc d \ n \ n \ n \ n \ n \ 000 \ n \ 000e \ 000 \ 000 \ nf' | grep -cz '^' # 5 # printf 'ab \ nc d \ n \ n \ n \ n \ n \ 000 \ n \ 000e \ 000 \ 000 \ nf' | grep -c '$' # 9 # За замовчуванням, як роздільник, приймається символ перекладу рядка (\ n). # Зверніть увагу: ключ -z характерний для GNU-версії "grep". # Спасибі SC

Якщо grep викликається для пошуку по групі файлів, то висновок буде містити вказівку на імена файлів, в яких знайдені збіги.

bash $ grep Linux osinfo.txt misc.txt osinfo.txt: This is a file containing information about Linux. osinfo.txt: The GPL governs the distribution of the Linux operating system. misc.txt: The Linux operating system is steadily gaining in popularity.

Для того, щоб змусити grep виводити ім'я файлу, коли пошук здійснюється по одному-єдиному файлу, досить вказати пристрій / dev / null в якості другого файлу.

bash $ grep Linux osinfo.txt / dev / null osinfo.txt: This is a file containing information about Linux. osinfo.txt: The GPL governs the distribution of the Linux operating system.

Якщо збіг було знайдено, то grep повертає код завершення - 0, це може виявитися корисним при виконанні пошуку в умовних операторах (в таких випадках особливий інтерес може представляти ключ -q, який пригнічує висновок).

SUCCESS = 0 # якщо знайдено збіг word = Linux filename = data.file grep -q "$ word" "$ filename" # "-q" - пригнічує висновок на stdout. if [$? -eq $ SUCCESS] then echo "Зразок $ word знайдений в $ filename" else echo "Зразок $ word в файлі $ filename не найден" fi

приклад 29-6 - приклад пошуку заданого зразка в системному журналі, за допомогою grep.

Приклад 12-12. Сценарій-емулятор

#! / Bin / bash # grp.sh: Дуже "груба" реалізація "grep '. E_BADARGS = 65 if [-z "$ 1"] # Перевірка наявності аргументів. then echo "Порядок використання:` basename $ 0` pattern "exit $ E_BADARGS fi echo for file in * # Обхід всіх файлів в $ PWD. do output = $ (sed -n / "$ 1" / p $ file) # Підстановка команд. if [! -z "$ output"] # Що станеться, якщо лапки навколо "$ output" прибрати? then echo -n "$ file:" echo $ output fi # еквівалент: sed -ne "/ $ 1 / s | ^ | $ {file}: | p" echo done echo exit 0 # Вправи: # ------ --- # 1) Додайте висновок символів переведення рядка, якщо знайдено більше одного збігу в будь-якому з файлів. # 2) Додайте обробку різних ключів.

egrep - те ж саме, що і grep -E. Ця команда використовує дещо відрізняється, розширений набір регулярних виразів , Що дозволяє виконувати пошук більш гнучко.

fgrep - те ж саме, що і grep -F. Ця команда виконує пошук рядків символів (НЕ регулярних виразів), що трохи збільшує швидкість пошуку.

Утиліта agrep має більш широкі можливості пошуку приблизних збігів. Зразок пошуку може відрізнятися від знайденої рядки на вказане число символів.

Для пошуку по стисненим файлів слід використовувати утиліти zgrep, zegrep або zfgrep. Вони з успіхом можуть використовуватися й у в повному стислих файлів, але в цьому випадку вони поступаються в швидкості звичайним grep, egrep і fgrep. Вони дуже зручні при виконанні пошуку по змішуванню набору файлів - коли одні файли стиснуті, а інші ні.

Для пошуку по bzip -Файл використовуйте bzgrep.

look

Команда look дуже схожа на grep, і призначена для пошуку по - відсортованим файлів. За замовчуванням, пошук виконується в файлі / usr / dict / words, але може бути вказаний і інший словник.

Приклад 12-13. Пошук слів у словнику

#! / Bin / bash # lookup: Виконується пошук кожного слова з файлу в словнику. file = words.data # Файл з шуканими словами. echo while [ "$ word"! = end] # Останнє слово в файлі. do read word # З файлу, тому, що виконано перенаправлення в кінці циклу. look $ word> / dev / null # Придушення виведення рядків зі словника. lookup = $? # Код повернення команди 'look'. if [ "$ lookup" -eq 0] then echo "Слово \" $ word \ "знайдено." else echo "Слово \" $ word \ "не знайдено." fi done < "$ file" # Перенаправлення вводу з файлу $ file, так що "читання" проводиться звідти. echo exit 0 # ---------------------------------------------- ------------------ # Рядки, розташовані нижче не будуть виконані, оскільки вище стоїть команда "exit". # Stephane Chazelas запропонував коротший варіант: while read word && [[$ word! = End]] do if look "$ word"> / dev / null then echo "Слово \" $ word \ "знайдено." else echo "Слово \" $ word \ "не знайдено." fi done < "$ file" exit 0 sed, awk

Скриптові мови, спеціально розроблені для аналізу текстових даних.

sed

Неінтерактивний. Широко використовується в сценаріях мовою командної оболонки.

awk

Утиліта контекстного пошуку і перетворення тексту, чудовий інструмент для вилучення і / або обробки полів (колонок) в структурованих текстових файлах. Синтаксис awk нагадує мову C.

wc

wc -, лічильник слів у файлі або в потоці:

bash $ wc /usr/doc/sed-3.02/README 20 127 838 /usr/doc/sed-3.02/README [20 рядків 127 слів 838 символів]

wc -w підраховує тільки слова.

wc -l підраховує тільки рядки.

wc -c підраховує тільки символи.

wc -L повертає довжину найбільшої рядки.

Підрахунок кількості .txt-файлів в поточному каталозі за допомогою wc:

$ Ls * .txt | wc -l # Ця команда буде працювати, якщо ні в одному з імен файлів "* .txt" немає символу перекладу рядка. # Альтернативний варіант: # find. -maxdepth 1 -name \ *. txt -print0 | grep -cz. # (Shopt -s nullglob; set - * .txt; echo $ #) # Спасибі SC

Підрахунок загального розміру файлів, чиї імена починаються з символів, в діапазоні d - h

bash $ wc [dh] * | grep total | awk '{print $ 3}' 71832

Від перекладача: в разі, якщо у вас локаль відмінна від "C", то вищенаведена команда може не дати результату, оскільки wc повернеться не слово "total", в кінці виведення, а "разом". Тоді можна спробувати трохи змінений варіант:

bash $ wc [dh] * | grep разом | awk '{print $ 3}' 71832

Використання wc для підрахунку кількості входжень слова в основний вихідний файл з текстом цього керівництва.

bash $ grep Linux abs-book.sgml | wc -l 50

Див. також приклад 12-30 і приклад 16-7 .

Окремі команди мають у своєму розпорядженні функціональністю wc у вигляді власних джерел.

... | grep foo | wc -l # Найпоширеніша конструкція, яка може бути скорочена. ... | grep -c foo # Ключ "-c" ( "--count") команди grep. # Спасибі SC
tr

Заміна одних символів на інші.

Команда tr "AZ" "*" <filename або tr AZ \ * <filename замінює всі символи верхнього регістру в filename на зірочки (висновок виробляється на stdout). У деяких системах цей варіант може виявитися непрацездатним, тоді спробуйте tr AZ '[**]'.

Ключ -d видаляє символи з заданого діапазону.

echo "abcdef" # abcdef echo "abcdef" | tr -d bd # aef tr -d 0-9 <filename # Видалить все цифрові символи з файлу "filename".

Ключ --squeeze-repeats (-s) видалить всі повторювані послідовності символів. Може використовуватися для видалення зайвих пробільних символів .

bash $ echo "XXXXX" | tr --squeeze-repeats 'X' X

Ключ -c замінить символи відповідно до шаблону. Цей ключ впливає тільки на ті символи, які НЕ відповідають заданим шаблоном.

bash $ echo "acfdeb123" | tr -c bd + + c + d + b ++++

Зверніть увагу: команда tr коректно розпізнає символьні класи POSIX .

bash $ echo "abcd2ef1" | tr '[: alpha:]' - ---- 2--1

Приклад 12-14. toupper: Перетворення символів у верхній регістр.

#! / Bin / bash # Перетворення символів у верхній регістр. E_BADARGS = 65 if [-z "$ 1"] # Стандартна перевірка командного рядка. then echo "Порядок використання:` basename $ 0` filename "exit $ E_BADARGS fi tr az AZ <" $ 1 "# Той же ефект можна отримати при використанні символьних класів POSIX: # tr '[: lower:]' '[: upper:] '< "$ 1" # Спасибі SC exit 0

Приклад 12-15. lowercase: Зміна імен всіх файлів в поточному каталозі в нижній регістр.

#! / Bin / bash # # Чи змінить все імена файлів в поточному каталозі в нижній регістр. # For filename in * # Обхід всіх файлів в каталозі. do fname = `basename $ filename` n =` echo $ fname | tr AZ az` # Перевести символи в нижній регістр. if [ "$ fname"! = "$ n"] # Перейменувати тільки ті файли, імена яких змінилися. then mv $ fname $ n fi done exit 0 # Сірокі наведені нижче не будуть виконуватися, оскільки вище стоїть команда "exit". # ------------------------------------------------- ------- # # Запустіть цю частину сценарію, видаливши рядки, які стоять вище. # Сценарій, наведений вище, не працює з іменами файлів, що містять пробіли або символи перекладу рядка. # У зв'язку з цим, Stephane Chazelas запропонував наступний варіант: for filename in * # Немає необхідності використовувати basename, # оскільки "*" повертає імена, що не містять "/". do n = `echo" $ filename / "| tr '[: upper:]' '[: lower:]' '# символьні класи POSIX. # Завершальний слеш доданий для того, щоб символ перекладу рядка # ні видалений при підстановці команди. # Підстановка змінної: n = $ {n% /} # Видалення завершального слеша, доданого вище. [[$ Filename == $ n]] || mv "$ filename" "$ n" # Перевірка - чи дійсно змінилося ім'я файлу. done exit 0

Приклад 12-16. du: Перетворення текстового файлу з формату DOS у формат UNIX.

#! / Bin / bash # du.sh: Перетворення текстового файлу з формату DOS у формат UNIX. E_WRONGARGS = 65 if [-z "$ 1"] then echo "Порядок использование:` basename $ 0` filename-to-convert "exit $ E_WRONGARGS fi NEWFILENAME = $ 1.unx CR = '\ 015' # Повернення каретки. # Рядки в текстових файлах DOS завершуються комбінацією сімволів CR-LF. tr -d $ CR <$ 1> $ NEWFILENAME # ВИДАЛИТИ символи CR и Записати в новий файл. echo "Вихідний текстовий файл: \" $ 1 \ "." echo "Перетворений файл: \" $ NEWFILENAME \ "." exit 0

Приклад 12-17. rot13: надслабка шифрування за алгоритмом rot13.

#! / Bin / bash # rot13.sh: Класичний алгоритм шифрування rot13, # який здатний "розколоти" навіть 3-х річна дитина. # Порядок використання: ./rot13.sh filename # або ./rot13.sh <filename # або ./rot13.sh і ввести текст з клавіатури (stdin) cat "$ @" | tr 'a-zA-Z' 'n-za-mN-ZA-M' # "a" замінюється на "n", "b" на "o", і т.д. # Конструкція 'cat "$ @"' # + дозволяє вводити дані як зі stdin, так і з файлу. exit 0

Приклад 12-18. більш шифр

#! / Bin / bash # crypto-quote.sh: Обмежене шифрування # Шифрування обмежується простою заміною одних алфавітних символів іншими. # Результат дуже схожий на шифри-загадки key = ETAOINSHRDLUBCFGJMQPVWZYXK # Тут, "key" - ні що інше, як "перемішаний" алфавіт. # Зміна ключа "key" призведе до зміни шифру. # Конструкція 'cat "$ @"' дозволяє вводити дані як зі stdin, так і з файлу. # Якщо використовується stdin, то введення повинен завершуватися комбінацією Control-D. # Інакше, в командному рядку, сценарієм повинно бути передано ім'я файлу. cat "$ @" | tr "az" "AZ" | tr "AZ" "$ key" # | в верхній регістр | шифрування # Такий прийом дозволяє шифрувати як символи в верхньому регістрі, так і в нижньому. # Неалфавітних символи залишаються без змін. # Спробуйте зашифрувати будь-якої текст, наприклад # "Nothing so needs reforming as other people's habits." # --Mark Twain # # Результат буде: # "CFPHRCS QF CIIOQ MINFMBRCS EQ FPHIM GIFGUI'Q HETRPQ." # --BEML PZERC # Для дешифрування можна використовувати наступну комбінацію: # cat "$ @" | tr "$ key" "AZ" # Цей нехитрий шифр може бути "зламаний" 12-ти річною дитиною # + за допомогою олівця і паперу. exit 0 fold

Вирівнює текст по ширині, розриваючи, якщо це необхідно, слова. Особливий інтерес представляє ключ -s, який виробляє перенесення рядків по прогалин, намагаючись не розривати слова. (Див. приклад 12-19 и Приклад A-2 ).

fmt

Дуже проста утиліта форматування тексту, найчастіше використовувана як фільтр в конвеєрах для того, щоб виконати довгих рядків тексту.

Приклад 12-19. Відформатований список файлів.

#! / Bin / bash WIDTH = 40 # 40 символів в рядку. b = `ls / usr / local / bin` # Отримати список файлів ... echo $ b | fmt -w $ WIDTH # Те ж саме можна виконати командою # echo $ b | fold - -s -w $ WIDTH exit 0

Див. такоже приклад 12-4 .

Дуже потужною альтернативою утиліті fmt, є утиліта par (автор Kamil Toman), яку ви зможете знайти на http://www.cs.berkeley.edu/~amc/Par/ .

col

Ця утиліта з оманливою назвою видаляє з вхідного потоку символи зворотної подачі паперу (код ESC 7). Вона так само намагається замінити прогалини на табуляції. Основна область застосування утиліти col - фільтрація виведення окремих утиліт обробки тексту, таких як groff і tbl.

column

Форматування за стовпцями. Ця утиліта перетворює текст, наприклад будь-якої список, в табличное, більш, уявлення, вставляючи символи табуляції в міру необхідності.

Приклад 12-20. Приклад форматування списку файлів в каталозі

#! / Bin / bash # За основу сценарію взято приклад "man column". (Printf "PERMISSIONS LINKS OWNER GROUP SIZE DATE TIME PROG-NAME \ n" \; ls -l | sed 1d) | column -t # Команда "sed 1d" видаляє перший рядок, що виводиться командою ls, # + (для локалі "С" це рядок: "total N", # + де "N" - загальна кількість файлів. # Ключ -t, команди "column", означає "табличне" уявлення. exit 0 colrm

Утиліта видалення колонок. Видаляє колонки (стовпчики) сиволов з файлу і виводить результат на stdout. colrm 2 4 <filename - видалить символи з 2-го по 4-й включно, в кожному рядку у файлі filename.

Якщо файл містить символи табуляції або недруковані символи, то результат може вийти найнесподіванішим. У таких випадках, як правило, утиліту colrm, в конвеєрі, оточують командами expand і unexpand.

nl

Нумерує рядки в файлі. nl filename - виведе файл filename на stdout, і на початку кожного рядка вставить її порядковий номер, рахунок починається з першої непорожній рядки. Якщо файл не вказується, то приймається введення зі stdin.

Висновок команди nl дуже нагадує cat -n, однак, по-замовчуванню nl не нумеруються порожні рядки.

Приклад 12-21. nl: Самонумерующійся сценарій.

#! / Bin / bash # Сценарій виводить себе сам на stdout двічі, нумеруя рядки сценарію. # 'Nl' вставить для цього рядка номер 3, оскільки вона не нумерує порожні рядки. # 'Cat -n' вставить для цього рядка номер 5. nl `basename $ 0` echo; echo # А тепер спробуємо вивести текст сценарію за допомогою 'cat -n' cat -n `basename $ 0` # Відмінності полягають у тому, що 'cat -n' нумерує всі рядки. # Зверніть увагу: 'nl -ba' - зробить те ж саме. exit 0 pr

Підготовка файлу до друку. Утиліта робить розбивку файлу на сторінки, приводячи його в вид придатний для друку або для виведення на екран. Різноманітні ключі дозволяють виконувати різні маніпуляції над рядками і колонками, з'єднувати рядки, встановлювати поля, нумерувати рядки, додавати колонтитули і багато, багато іншого. Утиліта pr поєднує в собі функціональність таких команд, як nl, paste, fold, column і expand.

pr -o 5 --width = 65 fileZZZ | more - видасть добре оформлене і розбите на сторінки вміст файлу fileZZZ.

Хочу особливо відзначити ключ -d, який виводить рядки з подвійним інтервалом (той же ефект, що і sed -G).

gettext

GNU утиліта, призначена для потреб локалізації і перекладу повідомлень програм, що виводяться на екран, на мову користувача. Не дивлячись на те, що це актуально, перш за все, для програм на мові C, проте gettext з успіхом може використовуватися в сценаріях командної оболонки для тих же цілей. Див. Info page.

iconv

Утиліта перетворення тексту з одного кодування в іншу. В основному використовується для потреб локалізації.

recode

Може розглядатися як разновілность утиліти iconv, описаної вище. Універсальна утиліта для перетворення текстової інформації в різні кодування.

TeX, gs

TeX і Postscript - мови розмітки тексту, використовувані для підготовки тексту до друку або висновку на екран.

TeX - це складна система підготовки до друку, розроблена Дональдом Кнутом (Donald Knuth). Цю утиліту зручніше використовувати всередині сценарію, ніж в командному рядку, оскільки в сценарії простіше один раз записати всі необхідні параметри, що передаються утиліті, для отримання необхідного результату.

Ghostscript (gs) - це GPL-версія інтерпретатора Postscript.

groff, tbl, eqn

groff - це ще одна мова розмітки тексту і форматованого виведення. Є розширеною GNU-версією пакета roff / troff в UNIX-системах.

tbl - утиліта обробки таблиць, повинна розглядатися як складова частина groff, так як її завданням є перетворення таблиць в команди groff.

eqn - утиліта перетворення математичних виразів в команди groff.

lex, yacc

lex - утиліта лексичного розбору тексту. В Linux-системах замінена на вільно поширювану утиліту flex.

yacc - утиліта для створення синтаксичних аналізаторів, на основі набору граматик, що задаються розробником. В Linux-системах, ця утиліта замінена на вільно поширювану утиліту bison.

ARGS = 1 E_BADARGS = 65 E_NOFILE = 66 if [$ # -ne "$ ARGS"] # Файл для аналізу заданий?
If [$?
Z "$ output"] # Що станеться, якщо лапки навколо "$ output" прибрати?
Lookup = $?


Новости
  • Виртуальный хостинг

    Виртуальный хостинг. Возможности сервера распределяются в равной мере между всеми... 
    Читать полностью

  • Редизайн сайта

    Редизайн сайта – это полное либо частичное обновление дизайна существующего сайта.... 
    Читать полностью

  • Консалтинг, услуги контент-менеджера

    Сопровождение любых интернет ресурсов;- Знание HTML и CSS- Поиск и обновление контента;-... 
    Читать полностью

  • Трафик из соцсетей

    Сравнительно дешевый способ по сравнению с поисковым и контекстным видами раскрутки... 
    Читать полностью

  • Поисковая оптимизация

    Поисковая оптимизация (англ. search engine optimization, SEO) — поднятие позиций сайта в результатах... 
    Читать полностью