J'entre dans le monde de Linux et au travail j'utilise de grep
plus en plus. Ce faisant, je me rends compte que parfois ce n'est pas suffisant pour ce que je veux.
Je me battais avec il y grep
a quelques jours et un de mes collègues qui est un administrateur Linux senior, m'a dit d'utiliser awk
. J'ai été stupéfait de la vitesse à laquelle j'ai obtenu un résultat.
Donc ma question est quand choisissez-vous d'utiliser l'un sur l'autre? Quelles questions puis-je me poser avant d'aller travailler grep
et de passer beaucoup de temps, quand j'aurais pu le faire awk
et gagner du temps?
less
pour afficher un fichier. Utilisezgrep
pour rechercher dans un fichier. Utilisezsed
pour modifier un fichier. Utilisezawk
plusieurs foisgrep
etsed
lorsque le fichier que vous souhaitez traiter a une sorte de structure (comme des colonnes). Utilisez-sed
leawk
lorsque vous souhaitez principalement traiter des lignes (telles que supprimer ou ajouter des lignes de texte). Je suis sûr que quelqu'un écrira une réponse de 20 pages plus complète que la mienne.Réponses:
sed
etawk
sont des sur-ensembles degrep
, il y a des choses qui sont plus faciles à faire avec l'un ou l'autre.grep foo
peut être écritsed '/foo/!d'
ouawk /foo/
, mais considérez:grep -i foo
devrait être àsed '/[fF][oO][oO]/!d'
moins que vous ne vouliez considérer des extensions non standard comme GNUsed '/foo/I!d'
. Ou avecawk
:awk 'tolower($0) ~ /foo/'
ou encore en utilisant une extension GNU:awk -v IGNORECASE=1 /foo/
.Choses que les différents outils sont bons et encombrants avec les autres outils:
grep
grep
est un outil simple mais possède des modes de fonctionnement très spécialisés qui sont plus difficiles à reproduire avecawk
oused
:grep -i
pour la correspondance insensible à la casse (voir ci-dessus)grep -Fe "$string"
pour la recherche de chaînes fixes (export string; awk 'index($0, ENVIRON["string"])'
avecawk
, pas d'équivalent direct avecsed
).grep -r
pour la recherche récursivegrep -P
/pcregrep
pour lessed
expressions rationnelles de type perl (certaines implémentations prennent en charge les expressions rationnelles de type perl mais pas les plus importantes)grep -o
pour renvoyer la partie correspondante (plusieurs lignesawk
oused
pour faire de même)grep -A/B/C
pour retourner le contexte autour du match (encore une fois douloureux à faire de manière similaire avecsed
ouawk
)sed
s/foo/bar/
:sed
De »s
la commande a des caractéristiques qui sont difficiles à mettre en œuvreawk
comme:s/foo\(.*\)bar/\1/g
: capture (bien que GNU awk ait unegensub()
extension pour cela)s/foo/bar/3
: remplacer la 3e occurrence sur chaque ligneawk
maintenant).awk
awk
est la plus riche en fonctionnalités des trois.perl
perl
comme un outil pratique d'extraction et de reporting a le meilleur de tous ceux-là. C'est pour cela qu'il a été initialement conçu (pour être l'outil qui rend tout celased
/awk
obsolète).La maîtrise
perl
du traitement de texte donne un sérieux avantage. Je recommanderais d'y consacrer un peu de temps, avant même de regarder lessed
commandes les moins courantes par exemple.performance
En règle générale, plus l'outil est spécialisé, plus il est efficace dans la tâche. Mais cela dépend aussi beaucoup de la mise en œuvre, de la tâche et de quelques autres facteurs et performances qui peuvent avoir des compromis à prendre en compte.
Par exemple, il y a quelques
grep
oused
mises en œuvre qui sont très rapides, mais , par exemple , ils ne prennent pas en charge les caractères multi - octets ne peuvent donc pas fonctionner correctement sur le texte anglais américain dans des endroits multi - octets. Ou ils sont rapides car ils fonctionnent sur un petit tampon de longueur fixe et ne peuvent donc pas fonctionner sur des entrées arbitraires ...la source
awk
est beaucoup plus rapide quegrep
.mawk
est connu pour être très efficace (mais ne prend pas en charge les caractères multi-octets, ce qui explique en partie qu'il est plus efficace que d'autres outils)