Коли використовувати grep, менше, awk, sed [закрито]


17

Я входжу у світ Linux і на роботі використовую grepвсе більше і більше. Роблячи це, я розумію, що іноді це не адекватно тому, що я хочу.

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

Тож моє запитання - коли ви вирішите використовувати один над іншим? Які питання я можу задати собі перед тим, як піти на роботу grepі витратити багато часу, коли я міг би це зробити awkі заощадив час?


Це хороше питання, але воно дійсно дуже широке і в першу чергу засноване на думках. Щоб відповісти на ваше запитання, використання grep на відміну від awk насправді залежить від того, наскільки зручно ви використовуєте awk / sed. Є кілька причин, чому можна було б використовувати це над останнім, наприклад, шукати щось більш конкретне, ніж те, що може запропонувати grep, або якщо ви намагаєтеся замінити / редагувати файли певним рядком (використовуючи sed). Але знову ж таки, все залежить від рівня вашого комфорту та досвіду використання awk / sed.
ryekayo

7
Використовуйте lessдля перегляду файлу. Використовуйте grepдля пошуку по файлу. Використовуйте sedдля редагування файлу. Використовуйте awkнад grepі sedколи файл, який ви хочете обробити, має якусь структуру (наприклад, стовпці). Використовуйте sedбільше, awkколи ви хочете мати справу з рядками (наприклад, видалити або додати рядки тексту). Я впевнений, що хтось напише відповідь на 20 сторінок, яка є більш повною, ніж моя.
Satō Katsura

Привіт Сато, справа не в довжині, а в тому, що сказано. І ви кілька рядків дуже інформативні. Дякую.
frankguthrie

Відповіді:


25

sedі awkє наборами grep, є речі, які простіше зробити з тим чи іншим.

grep fooможна написати sed '/foo/!d'або awk /foo/, але врахуйте:

grep -i fooце повинно бути, sed '/[fF][oO][oO]/!d'якщо ви не хочете розглянути нестандартні розширення типу GNU sed '/foo/I!d'. Або з awk: awk 'tolower($0) ~ /foo/'або знову з допомогою розширення GNU: awk -v IGNORECASE=1 /foo/.

Речі, які мають різні інструменти, добре справляються з іншими інструментами:

греп

grepце простий інструмент , але дуже спеціалізовані режими роботи, які важче відтворити за awkабо sed:

  • grep -i для нечутливої ​​відповідності випадку (див. вище)
  • grep -Fe "$string"для фіксованої пошукову послідовність ( export string; awk 'index($0, ENVIRON["string"])'з awk, немає прямого еквівалента з sed).
  • (нестандартний) grep -rдля рекурсивного пошуку
  • (нестандартний) grep -P/ pcregrepдля perl-подібних регулярних виразів (у деяких sedреалізаціях є perl-схожа підтримка regexp, хоча не найважливіша)
  • (нестандартно), grep -oщоб повернути збірну частину (кілька рядків awkабо sedзробити те ж саме)
  • (нестандартно) grep -A/B/Cдля повернення контексту навколо матчу (знову болісно робити аналогічно з sedабо awk)

sed

  • s/foo/bar/: sed's sкоманда має функції, які важко реалізувати у awkтаких як:
  • s/foo\(.*\)bar/\1/g: захоплення (хоча GNU awk має gensub()для цього розширення)
  • s/foo/bar/3: замініть 3-е виникнення у кожному рядку
  • (нестандартне): на місці редагування файлів (хоча це також підтримується GNU awk).

awk

awk є найбільш багатою функцією з цих трьох.

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

перл

perlяк практичний інструмент вилучення та звітності є найкращим з усіх. Саме для цього він був розроблений спочатку (щоб бути інструментом, який робить усіх тих sed/ awkзастарілими).

Освоєння perlобробки тексту дійсно дає серйозну перевагу. Я рекомендую витратити на це деякий час, навіть перш ніж переглядати, наприклад, менш поширені sedкоманди.

виконання

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

Наприклад, є деякі grepабо sedреалізації, які дуже швидкі, але, наприклад, вони не підтримують багатобайтові символи, тому вони можуть правильно працювати лише на американсько-англійському тексті у багатобайтових мовах. Або вони швидкі, тому що працюють на невеликому буфері фіксованої довжини і тому не можуть працювати на довільному введенні ...


Відмінна відповідь! Чи знаєте ви про ефективність інструментів? Мене бентежить заява ОП, awkце набагато швидше, ніж grep.
pfnuesel

@pfnuesel, це дуже залежить від впровадження та схеми використання. Наприклад, mawkвін , як відомо, дуже ефективний (але не підтримує багатобайтові символи, що є частиною причини, яка є більш ефективною, ніж деякі інші інструменти)
Stéphane Chazelas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.