Nous savons que nous pouvons obtenir la deuxième colonne de la ligne que nous voulons à partir d'un fichier en utilisant ces deux techniques:
awk '/WORD/ { print $2 }' filename
ou
grep WORD filename| cut -f 2 -d ' '
Mes questions sont:
- Quelles sont les différences entre les deux commandes ci-dessus?
- Lequel a les meilleures performances?
- Quels sont les avantages de l'utilisation par
awk
rapport à l'utilisationcut
, et vice versa? - Quelles options
awk
nous offrent-ilscut
et vice versa?
awk
grep
performance
cut
Networker
la source
la source
echo filename
oucat filename
?Réponses:
La différence la plus importante entre vos deux lignes dépend de l'entrée.
cut
prend un seul caractère-d
comme délimiteur de champ (la valeur par défaut étant TAB), et chaque occurrence unique de ce caractère démarre un nouveau champ.awk
est cependant plus flexible. Le séparateur est dans laFS
variable et peut être une chaîne vide (chaque caractère d'entrée crée un champ séparé), un seul caractère ou une expression régulière. Le cas particulier d'un seul caractère d'espace (par défaut) signifie la division sur n'importe quelle séquence d'espaces. Supprime également lesawk
espaces blancs de début par défaut.Veuillez comparer:
Ici,
awk
se divise sur la séquence d'espaces entreabc
etdef
tandis quecut
prend chaque espace comme séparateur.Ce que vous prenez dépendra de ce que vous voulez réaliser. Sinon, je m'attendrais
cut
à être plus rapide car c'est un outil plus petit et à usage unique alors qu'ilawk
a son propre langage de programmation.la source
cut
est susceptible d'être plus rapide que Awk seul , mais il n'est pas certain que cegrep ... | cut
sera plus rapide que Awk pur.De manière générale, plus un outil est spécialisé, plus il est rapide. Donc, dans la plupart des cas, vous pouvez vous attendre
cut
etgrep
être plus rapide quesed
, etsed
être plus rapide queawk
. Si vous comparez des pipelines plus longs d'outils plus simples avec une seule invocation d'un outil plus complexe, il n'y a pas de règle d'or. Cela ne concerne que les entrées importantes (par exemple, des millions de lignes); pour les entrées courtes, vous ne verrez aucune différence.L'avantage des outils plus complexes est bien sûr qu'ils peuvent faire plus de choses.
Vos commandes utilisent inutilement cat. Utilisez plutôt la redirection (surtout si vous êtes préoccupé par la vitesse, même si vous ne devriez probablement pas vous inquiéter de la vitesse tant que vous n'avez pas effectué de tests de performance¹).
Ces commandes sont presque équivalentes. Les différences sont les suivantes:
grep -E
ont des syntaxes regexp presque identiques (expressions régulières étendues).cut -d ' '
traite chaque caractère d'espace individuel comme un délimiteur. Le délimiteur par défaut d'Awk est n'importe quelle séquence d'espaces blancs, qui peut être plusieurs espaces, un onglet, etc. Vous ne pouvez pas utiliser des séquences d'espaces arbitraires comme séparateurs aveccut
. Pour utiliser des espaces individuels comme séparateurs dans awk, régler le séparateur de champ à une expression rationnelle qui correspond à un seul espace, autre qu'une expression rationnelle , comprenant un espace unique ( ce qui est un cas spécial signifiant « toute séquence d'espaces blancs », à savoir la valeur par défaut):awk -F '[ ]' '/WORD/ {print $2}'
.¹ La première règle d'optimisation de programme: ne le faites pas. La deuxième règle de l'optimisation des programmes (pour les experts seulement!): Ne le faites pas encore. - Michael A. Jackson
la source
Votre commande,
Vous n'avez même pas besoin d'une
cat
commande. Vous pouvez essayer,Et la commande ci-dessous redirige la sortie de cat vers grep puis vers cut,
Nous devons très probablement éviter la redirection de sortie. Awk fait le travail sur une seule ligne mais a
cut
besoin d'unegrep
commande pour obtenir uniquement les lignes qui contiennent un mot particulier et il imprime la colonne 2 en fonction de l'espace du délimiteur.Vous pouvez faire les choses dans awk si cut ne parvient pas à le faire.
la source
grep WORD filename
.