Cuándo usar grep, less, awk, sed [cerrado]

17

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?

frankguthrie
fuente
Esta es una buena pregunta, pero realmente es muy amplia y se basa principalmente en la opinión. Para responder a su pregunta, usar grep en lugar de awk realmente depende de qué tan cómodo esté usando awk / sed. Hay algunas razones por las cuales uno usaría esto sobre este último, como buscar algo más específico que lo que grep tiene para ofrecer o si está tratando de reemplazar / editar archivos con una cadena específica (usando sed). Pero nuevamente, todo depende de su nivel de comodidad y experiencia con el uso de awk / sed.
ryekayo
77
Use lesspara ver un archivo. Use greppara buscar en un archivo. Use sedpara editar un archivo. Use awkover grepy sedcuando el archivo que desea procesar tenga algún tipo de estructura (como columnas). Utilizar sedmás awkcuando 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.
Satō Katsura
Hola Sato, no se trata de la longitud, sino de lo que se dice. Y pocas líneas son muy informativas. Gracias.
frankguthrie

Respuestas:

25

sedy awkson supersets de grep, hay cosas que son más fáciles de hacer con uno u otro.

grep foose puede escribir sed '/foo/!d'o awk /foo/, pero considere:

grep -i footendría que serlo a sed '/[fF][oO][oO]/!d'menos que desee considerar extensiones no estándar como las GNU sed '/foo/I!d'. O con awk: 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 con awko sed:

  • 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"])'con awk, sin equivalente directo con sed).
  • (no estándar) grep -rpara búsqueda recursiva
  • (no estándar) grep -P/ pcregreppara expresiones regulares de tipo perl (algunas sedimplementaciones tienen soporte de expresiones regulares de tipo perl, aunque no las más importantes)
  • (no estándar) grep -opara devolver la parte coincidente (varias líneas de awko sedpara hacer lo mismo)
  • (no estándar) grep -A/B/Cpara devolver el contexto alrededor del partido (nuevamente doloroso de hacer de manera similar con sedo awk)

sed

  • s/foo/bar/: sedEl scomando tiene características que son difíciles de implementar en awk:
  • s/foo\(.*\)bar/\1/g: captura (aunque GNU awk tiene una gensub()extensión para eso)
  • s/foo/bar/3: reemplaza la tercera aparición en cada línea
  • (no estándar): edición de archivos en el lugar (aunque ahora también es compatible con GNU awk).

awk

awk es la característica más rica de las tres.

  • bueno para tratar con números
  • bueno para tratar con entradas formateadas en columnas.
  • bueno para extraer y combinar datos de diferentes fuentes, con sus matrices asociativas.

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 eso sed/ awkobsoleto).

Dominar perlpara hacer procesamiento de texto ofrece una gran ventaja. Recomiendo pasar un tiempo en él, incluso antes de mirar los sedcomandos 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 grepo sedimplementaciones 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 ...

Stéphane Chazelas
fuente
Excelente respuesta! ¿Conoces la eficiencia de las herramientas? Estoy confundido acerca de la declaración del OP, que awkes mucho más rápido que grep.
pfnuesel
@pfnuesel, eso depende mucho de la implementación y del patrón de uso. Por ejemplo, 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)
Stéphane Chazelas