Awk

20 awk примера

20 awk примера

20 awk примера

В операционната система Linux съществуват много помощни инструменти за търсене и генериране на отчет от текстови данни или файл. Потребителят може лесно да изпълнява много видове търсене, подмяна и генериране на задачи за генериране чрез използване на команди awk, grep и sed. awk не е просто команда. Това е скриптов език, който може да се използва както от терминал, така и от awk файл. Той поддържа променливата, условния оператор, масив, цикли и т.н. като другите скриптови езици. Той може да чете всяко съдържание на файл ред по ред и да отделя полетата или колоните въз основа на определен разделител. Той също така поддържа регулярен израз за търсене на определен низ в текстовото съдържание или файл и предприема действия, ако се намери някакво съвпадение. Как можете да използвате командата и скрипта awk е показано в този урок, като използвате 20 полезни примера.

Съдържание:

  1. awk с printf
  2. awk да се раздели на бялото пространство
  3. awk за промяна на разделителя
  4. awk с данни, разделени с табулатори
  5. awk с csv данни
  6. awk регулярно изражение
  7. awk регистър, нечувствителен към регистъра
  8. awk с променлива nf (брой полета)
  9. awk gensub () функция
  10. awk с функция rand ()
  11. awk дефинирана от потребителя функция
  12. awk ако
  13. awk променливи
  14. awk масиви
  15. awk цикъл
  16. awk за отпечатване на първата колона
  17. awk за отпечатване на последната колона
  18. awk с grep
  19. awk с bash скрипт файла
  20. awk със sed

Използване на awk с printf

printf () функция се използва за форматиране на всякакви изходи в повечето от езиците за програмиране. Тази функция може да се използва с awk команда за генериране на различни типове форматирани изходи. awk команда, използвана главно за всеки текстов файл. Създайте текстов файл с име служител.текст със съдържанието, дадено по-долу, където полетата са разделени с таб ('\ t').

служител.текст

1001 Йоан Сена 40000
1002 Джафар Икбал 60000
1003 Meher Nigar 30000
1004 Джони Ливър 70000

Следващата команда awk ще чете данни от служител.текст файл ред по ред и отпечатайте първия файл след форматиране. Тук, "% 10s \ n”Означава, че изходът ще бъде с дължина 10 символа. Ако стойността на изхода е по-малка от 10 знака, интервалите ще бъдат добавени в предната част на стойността.

$ awk 'printf "% 10s \ n", $ 1' служител.текст

Изход:

Отидете на Съдържание

awk да се раздели на бялото пространство

Разделителят на думи или поле по подразбиране за разделяне на който и да е текст е празно пространство. Командата awk може да приема текстова стойност като вход по различни начини. Входният текст се предава от ехо команда в следващия пример. Текстът, 'Харесва ми програмирането'ще бъде разделен по подразбиране, пространство, и третата дума ще бъде отпечатана като изход.

$ echo 'Обичам програмирането' | awk 'print $ 3'

Изход:

Отидете на Съдържание

awk за промяна на разделителя

Командата awk може да се използва за промяна на разделителя за всяко съдържание на файл. Да предположим, че имате текстов файл с име телефон.текст със следното съдържание, където ':' се използва като разделител на полето на съдържанието на файла.

телефон.текст

+123: 334: 889: 778
+880: 1855: 456: 907
+9: 7777: 38644: 808

Изпълнете следната команда awk, за да промените разделителя, ':' от "-" към съдържанието на файла, телефон.текст.

$ котка телефон.текст
$ awk '$ 1 = $ 1' FS = ":" OFS = "-" телефон.текст

Изход:

Отидете на Съдържание

awk с данни, разделени с табулатори

Командата awk има много вградени променливи, които се използват за четене на текста по различни начини. Две от тях са FS и OFS. FS е разделител на полето за въвеждане и OFS е променливите на разделителя на изходното поле. Използването на тези променливи е показано в този раздел. Създавам раздел отделен файл с име вход.текст със следното съдържание за тестване на употребите на FS и OFS променливи.

Вход.текст

Клиентски скриптов език
Скриптен език от страна на сървъра
Сървър за бази данни
Уеб сървър

Използване на FS променлива с раздела

Следващата команда ще раздели всеки ред от вход.текст файл, базиран на раздела ('\ t') и отпечатайте първото поле на всеки ред.

$ awk 'print $ 1' FS = '\ t' вход.текст

Изход:

Използване на OFS променлива с раздел

Следващата команда awk ще отпечата 9ти и 5ти полета на 'ls -l' команден изход с разделител на раздели след отпечатване на заглавието на колоната “Име" и "Размер”. Тук, OFS променливата се използва за форматиране на изхода от раздел.

$ ls -l
$ ls -l | awk -v OFS = '\ t' 'НАЧАЛО printf "% s \ t% s \ n", "Име", "Размер" print $ 9, $ 5'

Изход:

Отидете на Съдържание

awk с CSV данни

Съдържанието на всеки CSV файл може да бъде анализирано по много начини, като се използва команда awk. Създайте CSV файл с име „клиент.csv'Със следното съдържание, за да приложите команда awk.

клиент.текст

Id, име, имейл, телефон
1, София, [имейл защитен], (862) 478-7263
2, Амелия, [имейл защитен], (530) 764-8000
3, Ема, [имейл защитен], (542) 986-2390

Четене на едно поле на CSV файл

„-F“ Опцията се използва с команда awk за задаване на разделителя за разделяне на всеки ред от файла. Следващата команда awk ще отпечата име сферата на клиентът.csv файл.

$ клиент котка.csv
$ awk -F "," 'print $ 2' клиент.csv

Изход:

Четене на множество полета чрез комбиниране с друг текст

Следващата команда ще отпечата три полета от клиент.csv чрез комбиниране на заглавния текст, Име, имейл и телефон. Първият ред на клиент.csv файл съдържа заглавието на всяко поле. NR променливата съдържа номера на реда на файла, когато команда awk анализира файла. В този пример, NR променливата се използва за пропускане на първия ред на файла. Резултатът ще покаже 2nd, 3rd и 4ти полета на всички редове с изключение на първия ред.

$ awk -F "," 'NR> 1 print "Име:" $ 2 ", имейл:" $ 3 ", телефон:" $ 4 "клиент.csv

Изход:

Четене на CSV файл с помощта на awk скрипт

awk скриптът може да бъде изпълнен чрез стартиране на awk файл. Как можете да създадете awk файл и да стартирате файла е показано в този пример. Създайте файл с име awkcsv.awk със следния код. НАЧАЛО ключовата дума се използва в скрипта за информиране на командата awk за изпълнение на скрипта на НАЧАЛО част преди изпълнението на други задачи. Тук, разделител на поле (FS) се използва за дефиниране на разделител за разделяне и 2nd и 1ул полетата ще бъдат отпечатани според формата, използван във функцията printf ().

awkcsv.awk
НАЧАЛО FS = "," printf "% 5s (% s) \ n", $ 2, $ 1

Бягай awkcsv.awk файл със съдържанието на клиентът.csv файл чрез следната команда.

$ awk -f awkcsv.awk клиент.csv

Изход:

Отидете на Съдържание

awk регулярно изражение

Регулярният израз е модел, който се използва за търсене на произволен низ в текст. Различните видове сложни задачи за търсене и замяна могат да бъдат направени много лесно, като се използва регулярният израз. В този раздел са показани някои прости употреби на регулярния израз с команда awk.

Съвпадащ набор от символи

Следващата команда ще съответства на думата Глупак или глупак или Готино с входния низ и отпечатайте, ако думата намери. Тук, Кукла няма да съвпадне и няма да се отпечата.

$ printf "Fool \ nCool \ nDoll \ nbool" | awk '/ [FbC] ool /'

Изход:

Търсене на низ в началото на реда

„^“ символ се използва в регулярния израз за търсене на произволен шаблон в началото на реда. 'Linux дума ще бъде търсена в началото на всеки ред от текста в следващия пример. Тук два реда започват с текста, „Linux'и тези два реда ще бъдат показани в изхода.

$ echo -e "Linux е безплатен за използване \ n Това е софтуер с отворен код \ nLinuxHint е
популярен блог сайт "| awk '/ ^ Linux /'

Изход:

Търсене на низ в края на реда

„$“ символ се използва в регулярния израз за търсене на произволен шаблон в края на всеки ред от текста. 'Сценарий'дума се търси в следния пример. Тук два реда съдържат думата, Сценарий в края на реда.

$ echo -e "PHP скрипт \ nJavaScript \ nВизуално програмиране" | awk '/ Script $ /'

Изход:

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

„^“ Символът показва началото на текста, когато той се използва пред произволен шаблон ('/ ^ ... /') или преди който и да е набор от символи, деклариран от ^ […]. Ако „^“ символ се използва вътре в третата скоба, [^ ...], тогава дефинираният набор от символи в скобата ще бъде пропуснат по време на търсене. Следващата команда ще търси всяка дума, която не започва „F“ но завършва с "ool'. Готино и bool ще бъдат отпечатани според шаблона и текстовите данни.

$ printf "Fool \ nCool \ nDoll \ nbool" | awk '/ [^ F] ool /'

Изход:

Отидете на Съдържание

awk регистър, нечувствителен към регистъра

По подразбиране регулярният израз прави търсене на регистър на регистъра, когато търси произволен шаблон в низа. Търсенето без разлика на регистъра може да се извърши чрез команда awk с регулярния израз. В следващия пример, да понижи() функция се използва за търсене без чувствителност към регистъра. Тук първата дума от всеки ред на въведения текст ще бъде преобразувана в малки букви с помощта на да понижи() функция и съвпадат с модела на регулярния израз. toupper () функция също може да се използва за тази цел, в този случай моделът трябва да бъде дефиниран от всички главни букви. Текстът, определен в следващия пример, съдържа думата за търсене, 'уеб'в два реда, които ще бъдат отпечатани като изход.

$ echo -e "Уеб дизайн \ nразработка на уеб \ nРамка" | awk 'tolower ($ 0) ~ / ^ web /;'

Изход:

Отидете на Съдържание

awk с променлива NF (брой полета)

NF е вградена променлива на команда awk, която се използва за преброяване на общия брой полета във всеки ред на въведения текст. Създайте всеки текстов файл с множество редове и множество думи. входа.текст тук се използва файл, който е създаден в предишния пример.

Използване на NF от командния ред

Тук първата команда се използва за показване на съдържанието на вход.текст файл и втората команда се използва за показване на общия брой полета във всеки ред от файла, използващ NF променлива.

$ котка вход.текст
$ awk 'print NF' вход.текст

Изход:

Използване на NF в awk файл

Създайте awk файл с име броя.awk със скрипта, даден по-долу. Когато този скрипт ще се изпълни с текстови данни, тогава всеки ред с общо поле ще бъде отпечатан като изход.

броя.awk

отпечатайте $ 0
print "[Общо полета:" NF "]"

Стартирайте скрипта чрез следната команда.

$ awk -f брой.awk вход.текст

Изход:

Отидете на Съдържание

awk gensub () функция

getub () е функция за заместване, която се използва за търсене на низ, базиран на определен разделител или модел на регулярен израз. Тази функция е дефинирана в  "gawk" пакет, който не е инсталиран по подразбиране. Синтаксисът на тази функция е даден по-долу. Първият параметър съдържа шаблона на регулярния израз или разделителя за търсене, вторият параметър съдържа заместващия текст, третият параметър показва как ще се извършва търсенето и последният параметър съдържа текста, в който ще бъде приложена тази функция.

Синтаксис:

gensub (regexp, заместване, как [, цел])

Изпълнете следната команда, за да инсталирате gawk пакет за използване getub () функция с команда awk.

$ sudo apt-get install gawk

Създайте текстов файл с име „информация за продажбите.текст'със следното съдържание, за да практикувате този пример. Тук полетата са разделени с раздел.

информация за продажбите.текст

Понеделник 700000
Втор 800000
Сряда 750000
Чет 200000
Петък 430000
Съб 820000

Изпълнете следната команда, за да прочетете числовите полета на информация за продажбите.текст файл и отпечатайте общата сума на всички продажби. Тук третият параметър „G“ показва глобалното търсене. Това означава, че шаблонът ще бъде търсен в цялото съдържание на файла.

$ awk 'x = gensub ("\ t", "", "G", $ 2); printf x "+" END print 0 'информация за продажбите.txt | bc -l

Изход:

Отидете на Съдържание

awk с функция rand ()

rand () функция се използва за генериране на произволно произволно число, по-голямо от 0 и по-малко от 1. Така че, той винаги ще генерира дробно число по-малко от 1. Следващата команда ще генерира дробно произволно число и ще умножи стойността с 10, за да получи число повече от 1. За прилагане на функцията printf () ще се отпечата дробно число с две цифри след десетичната запетая. Ако стартирате следната команда няколко пъти, тогава всеки път ще получавате различен изход.

$ awk 'BEGIN printf "Числото е =%.2f \ n ", rand () * 10 '

Изход:

Отидете на Съдържание

awk дефинирана от потребителя функция

Всички функции, които са използвани в предишните примери, са вградени функции. Но можете да декларирате дефинирана от потребителя функция във вашия awk скрипт, за да изпълнявате конкретна задача.  Да предположим, че искате да създадете персонализирана функция за изчисляване на площта на правоъгълник. За да направите тази задача, създайте файл с име '■ площ.awk'със следния скрипт. В този пример дефинирана от потребителя функция с име ■ площ() се декларира в скрипта, който изчислява площта въз основа на входните параметри и връща стойността на площта. getline команда се използва тук, за да вземе вход от потребителя.

■ площ.awk

# Изчислете площта
функционална област (височина, ширина)
връщаща височина * ширина

# Стартира изпълнение
НАЧАЛО
print "Въведете стойността на височина:"
getline h < "-"
print "Въведете стойността на width:"
getline w < "-"
отпечатайте "Area =" area (h, w)

Стартирайте скрипта.

$ awk -f област.awk

Изход:

Отидете на Съдържание

awk ако пример

awk поддържа условни изрази като другите стандартни езици за програмиране. В този раздел са показани три типа оператори if, като се използват три примера. Създайте текстов файл с име елементи.текст със следното съдържание.

елементи.текст

HDD Samsung 100 $
Мишка A4Tech
Принтер HP $ 200

Прост, ако пример:

следващата команда ще прочете съдържанието на елементи.текст файл и проверете 3rd стойност на полето във всеки ред. Ако стойността е празна, тя ще отпечата съобщение за грешка с номера на реда.

$ awk 'if ($ 3 == "") print "В полето" NR "липсва поле за цена.текст

Изход:

пример if-else:

Следващата команда ще отпечата цената на артикула, ако 3rd полето съществува в реда, в противен случай ще отпечата съобщение за грешка.

$ awk 'if ($ 3 == "") print "Полето за цена липсва"
else print "цената на артикула е" $ 3 '.текст

Изход:

if-else-if пример:

Когато следната команда ще се изпълни от терминала, тогава тя ще вземе вход от потребителя. Входната стойност ще се сравнява с всяко условие, ако условието е вярно. Ако някое условие стане вярно, то ще отпечата съответната оценка. Ако въведената стойност не съвпада с нито едно условие, тогава печатането ще се провали.

$ awk 'BEGIN print "Въведете марката:"
марка на getline <  "-"
ако (маркирайте> = 90) отпечатайте "A +"
иначе ако (маркирайте> = 80) отпечатайте "A"
иначе ако (маркирайте> = 70) отпечатайте "B +"
else print "Fail" '

Изход:

Отидете на Съдържание

awk променливи

Декларацията на променливата awk е подобна на декларацията на променливата на черупката. Има разлика в четенето на стойността на променливата. Символът „$“ се използва с името на променливата за променливата на черупката, за да се прочете стойността. Но няма нужда да използвате '$' с awk променлива, за да прочетете стойността.

Използване на проста променлива:

Следващата команда ще декларира променлива с име 'сайт' и на тази променлива се присвоява стойност на низ. Стойността на променливата се отпечатва в следващия израз.

$ awk 'BEGIN site = "LinuxHint.com "; сайт за печат '

Изход:

Използване на променлива за извличане на данни от файл

Следващата команда ще търси думата "Принтер" във файла елементи.текст. Ако някой ред на файла започва с „Принтер'тогава ще съхранява стойността на 1ул, 2nd и 3rd полета в три променливи. име и цена променливите ще бъдат отпечатани.

$ awk '/ Принтер / name = $ 1; brand = $ 2; price = $ 3; print "item name =" name;
отпечатайте "item price =" price 'артикули.текст

Изход:

Отидете на Съдържание

awk масиви

В awk могат да се използват както цифрови, така и свързани масиви. Декларацията за променлива на масив в awk е еднаква с другите езици за програмиране. Някои употреби на масиви са показани в този раздел.

Асоциативен масив: 

Индексът на масива ще бъде всеки низ за асоциативния масив.  В този пример се декларира и отпечатва асоциативен масив от три елемента.

$ awk 'НАЧАЛО
книги ["Уеб дизайн"] = "Изучаване на HTML 5";
books ["Web Programming"] = "PHP и MySQL"
books ["PHP Framework"] = "Учене Laravel 5"
printf "% s \ n% s \ n% s \ n", книги ["Уеб дизайн"], книги ["Уеб програмиране"],
книги ["PHP Framework"] '

Изход:

Числов масив:

Числовият масив от три елемента се декларира и отпечатва чрез разделяне на табулатора.

$ awk 'НАЧАЛО
число [0] = 80;
число [1] = 55;
число [2] = 76;

# елементи от масив за печат
printf "Стойности на масива:% d \ t% d \ t% d \ n", номер [0], номер [1], номер [2]; '

Изход:

Отидете на Съдържание

awk цикъл

Три вида цикли се поддържат от awk. Използването на тези цикли е показано тук, като се използват три примера.

Цикъл while:

while цикълът, който се използва в следващата команда, ще се повтори 5 пъти и ще излезе от цикъла за оператор break.

$ Awk 'НАЧАЛО n = 1; докато (n <= 10) if(n > 5) почивка; печат n; n ++ '

Изход:

За цикъл:

За цикъл, който се използва в следващата команда awk, ще изчисли сумата от 1 до 10 и ще отпечата стойността.

$ awk 'НАЧАЛО сума = 0; за (n = 1; n <= 10; n++) sum=sum+n; print sum '

Изход:

Цикъл за изпълнение:

цикъл за изпълнение на следната команда ще отпечата всички четни числа от 10 до 5.

$ awk 'НАЧАЛО брояч = 10; направете if (брояч% 2 == 0) брояч за печат; брояч--
докато (брояч> 5) '

Изход:

Отидете на Съдържание

awk за отпечатване на първата колона

Първата колона на всеки файл може да бъде отпечатана чрез използване на променлива $ 1 в awk. Но ако стойността на първата колона съдържа множество думи, тогава се отпечатва само първата дума от първата колона. Използвайки конкретен разделител, първата колона може да бъде отпечатана правилно. Създайте текстов файл с име ученици.текст със следното съдържание. Тук първата колона съдържа текста на две думи.

Студенти.текст

Каниз Фатема 30ти партида
Абир Хосейн 35ти партида
Йоан Авраам 40ти партида

Изпълнете команда awk без разделител. Ще бъде отпечатана първата част на първата колона.

$ awk 'print $ 1' ученици.текст

Изпълнете команда awk със следния разделител. Цялата част от първата колона ще бъде отпечатана.

$ awk -F '\\ s \\ s' 'print $ 1' ученици.текст

Изход:

Отидете на Съдържание

awk за отпечатване на последната колона

$ (NF) променливата може да се използва за отпечатване на последната колона на всеки файл. Следните команди awk ще отпечатат последната част и пълната част от последната колона на студентите.текст файл.

$ awk 'print $ (NF)' ученици.текст
$ awk -F '\\ s \\ s' print $ (NF) 'ученици.текст

Изход:

Отидете на Съдържание

awk с grep

grep е друга полезна команда на Linux за търсене на съдържание във файл, базиран на всеки регулярен израз. Как могат да се използват заедно командите awk и grep е показано в следващия пример. grep команда се използва за търсене на информация в идентификатора на служителя, '1002„от работникът.текст файл. Изходът на командата grep ще бъде изпратен към awk като входни данни. 5% бонус ще бъде изчислен и отпечатан въз основа на заплатата на идентификационния номер на служителя, '1002 ' по команда awk.

$ служител котка.текст
$ grep '1002' служител.txt | awk -F '\ t' 'print $ 2 "ще получи $" ($ 3 * 5) / 100 "бонус"'

Изход:

Отидете на Съдържание

awk с BASH файл

Подобно на други команди на Linux, командата awk също може да се използва в BASH скрипт. Създайте текстов файл с име клиенти.текст със следното съдържание. Всеки ред от този файл съдържа информация за четири полета. Това са идентификационните номера на клиента, име, адрес и мобилен номер, които са разделени '/'.

клиенти.текст

AL4934 / Charles M Brunner / 4838 Beeghley Street, Хънтсвил, Алабама / 256-671-7942
CA5455 / Вирджиния S Mota / 930 Bassel Street, VALLECITO, Калифорния / 415-679-5908
IL4855 / Ann A Neale / 1932 Patterson Fork Road, Чикаго, Илинойс / 773-550-5107

Създайте bash файл с име item_search.баш със следния скрипт. Според този скрипт стойността на състоянието ще бъде взета от потребителя и ще бъде търсена в клиентите.текст файл от grep команда и се предава на командата awk като вход. Командата Awk ще прочете 2nd и 4ти полета на всеки ред. Ако входящата стойност съвпада с която и да е стойност на състояние на клиенти.текст файл, след което ще отпечата този на клиента име и мобилен номер, в противен случай ще отпечата съобщението „Няма намерен клиент”.

item_search.баш

#!/ bin / bash
echo "Въведете името на държавата:"
състояние на четене
клиенти = 'grep "$ state" клиенти.txt | awk -F "/" 'print "Име на клиента:" $ 2, ",
Мобилен номер: „$ 4 ''
if ["$ клиенти" != ""]; тогава
echo $ клиенти
друго
echo "Няма намерен клиент"
fi

Изпълнете следните команди, за да покажете изходите.

$ клиенти за котки.текст
$ bash item_search.баш

Изход:

Отидете на Съдържание

awk със sed

Друг полезен инструмент за търсене на Linux е сед. Тази команда може да се използва както за търсене, така и за замяна на текст на всеки файл. Следващият пример показва използването на командата awk с сед команда. Тук командата sed ще търси всички имена на служители, започващи с 'J'и преминава към команда awk като вход. awk ще печата служител име и документ за самоличност след форматиране.

$ служител котка.текст
$ sed -n '/ J / p' служител.txt | awk -F '\ t' 'printf "% s (% s) \ n", $ 2, $ 1'

Изход:

Отидете на Съдържание

Заключение:

Можете да използвате командата awk за създаване на различни типове отчети въз основа на всякакви таблични или разграничени данни след правилно филтриране на данните. Надявам се, че ще можете да научите как работи командата awk, след като отработите примерите, показани в този урок.

Как да използвам AutoKey за автоматизиране на Linux игри
AutoKey е програма за автоматизация на настолни компютри за Linux и X11, програмирана в Python 3, GTK и Qt. Използвайки неговата функционалност за скр...
Как да покажа брояч на FPS в игрите на Linux
Linux игрите получиха голям тласък, когато Valve обяви поддръжка на Linux за Steam клиент и техните игри през 2012 г. Оттогава много AAA и независими ...
Как да изтеглите и пуснете Civilization VI на Сид Майер на Linux
Въведение в играта Civilization 6 е модерен поглед върху класическата концепция, въведена в поредицата от игрите Age of Empires. Идеята беше доста про...