Estoy entrando en el mundo de Linux y en el trabajo uso grepcada vez más. Al hacerlo, me doy cuenta de que a veces no es adecuado para lo que quiero.
Estaba luchando grephace unos días y un colega mío que es administrador senior de Linux me dijo que lo usara awk. Me sorprendió lo rápido que obtuve un resultado.
Entonces mi pregunta es ¿cuándo eliges usar uno sobre el otro? ¿Qué preguntas me puedo hacer antes de trabajar grepy pasar mucho tiempo, cuando podría haberlo hecho awky ahorrado tiempo?

lesspara ver un archivo. Usegreppara buscar en un archivo. Usesedpara editar un archivo. Useawkovergrepysedcuando el archivo que desea procesar tenga algún tipo de estructura (como columnas). Utilizarsedmásawkcuando se quiere principalmente para hacer frente a las líneas (tales como líneas de suprimir o añadir texto). Estoy seguro de que alguien escribirá una respuesta de 20 páginas que es más completa que la mía.Respuestas:
sedyawkson supersets degrep, hay cosas que son más fáciles de hacer con uno u otro.grep foose puede escribirsed '/foo/!d'oawk /foo/, pero considere:grep -i footendría que serlo ased '/[fF][oO][oO]/!d'menos que desee considerar extensiones no estándar como las GNUsed '/foo/I!d'. O conawk:awk 'tolower($0) ~ /foo/'o usando de nuevo una extensión de GNU:awk -v IGNORECASE=1 /foo/.Cosas en las que las diferentes herramientas son buenas y engorrosas con las otras herramientas:
grep
grepes una herramienta simple pero tiene modos de operación muy especializados que son más difíciles de reproducir conawkosed:grep -ipara la coincidencia entre mayúsculas y minúsculas (ver arriba)grep -Fe "$string"para búsqueda de cadena fija (export string; awk 'index($0, ENVIRON["string"])'conawk, sin equivalente directo consed).grep -rpara búsqueda recursivagrep -P/pcregreppara expresiones regulares de tipo perl (algunassedimplementaciones tienen soporte de expresiones regulares de tipo perl, aunque no las más importantes)grep -opara devolver la parte coincidente (varias líneas deawkosedpara hacer lo mismo)grep -A/B/Cpara devolver el contexto alrededor del partido (nuevamente doloroso de hacer de manera similar consedoawk)sed
s/foo/bar/:sedElscomando tiene características que son difíciles de implementar enawk:s/foo\(.*\)bar/\1/g: captura (aunque GNU awk tiene unagensub()extensión para eso)s/foo/bar/3: reemplaza la tercera aparición en cada líneaawk).awk
awkes la característica más rica de las tres.perl
perlcomo una práctica herramienta de extracción e informes tiene lo mejor de todos. Para eso fue diseñado inicialmente (para ser la herramienta que hace que todo esosed/awkobsoleto).Dominar
perlpara hacer procesamiento de texto ofrece una gran ventaja. Recomiendo pasar un tiempo en él, incluso antes de mirar lossedcomandos menos comunes , por ejemplo.actuación
Como regla general, cuanto más especializada es la herramienta, más eficiente es en la tarea. Pero eso también depende en gran medida de la implementación, la tarea y algunos otros factores y el rendimiento pueden tener compensaciones que pueden necesitar ser tenidas en cuenta.
Por ejemplo, hay algunas
greposedimplementaciones que son muy rápidas, pero por ejemplo no admiten caracteres multibyte, por lo que solo pueden funcionar correctamente en texto en inglés de EE. UU. En configuraciones regionales de varios bytes. O son rápidos porque funcionan en un pequeño búfer de longitud fija y, por lo tanto, no pueden funcionar en entradas arbitrarias ...fuente
awkes mucho más rápido quegrep.mawkse sabe que es muy eficiente (pero no admite caracteres multibyte, lo que es parte de la razón por la que es más eficiente que otras herramientas)