Estoy entrando en el mundo de Linux y en el trabajo uso grep
cada vez más. Al hacerlo, me doy cuenta de que a veces no es adecuado para lo que quiero.
Estaba luchando grep
hace 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 grep
y pasar mucho tiempo, cuando podría haberlo hecho awk
y ahorrado tiempo?
less
para ver un archivo. Usegrep
para buscar en un archivo. Usesed
para editar un archivo. Useawk
overgrep
ysed
cuando el archivo que desea procesar tenga algún tipo de estructura (como columnas). Utilizarsed
másawk
cuando 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:
sed
yawk
son supersets degrep
, hay cosas que son más fáciles de hacer con uno u otro.grep foo
se puede escribirsed '/foo/!d'
oawk /foo/
, pero considere:grep -i foo
tendrí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
grep
es una herramienta simple pero tiene modos de operación muy especializados que son más difíciles de reproducir conawk
osed
:grep -i
para 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 -r
para búsqueda recursivagrep -P
/pcregrep
para expresiones regulares de tipo perl (algunassed
implementaciones tienen soporte de expresiones regulares de tipo perl, aunque no las más importantes)grep -o
para devolver la parte coincidente (varias líneas deawk
osed
para hacer lo mismo)grep -A/B/C
para devolver el contexto alrededor del partido (nuevamente doloroso de hacer de manera similar consed
oawk
)sed
s/foo/bar/
:sed
Els
comando 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
awk
es la característica más rica de las tres.perl
perl
como 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
/awk
obsoleto).Dominar
perl
para hacer procesamiento de texto ofrece una gran ventaja. Recomiendo pasar un tiempo en él, incluso antes de mirar lossed
comandos 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
grep
osed
implementaciones 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
awk
es mucho más rápido quegrep
.mawk
se 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)