2016-07-22 2 views
-2

J'ai deux mêmes scripts. Dans un, j'utilise le chat et dans l'autre c'est tout AWK.Lire des fichiers en utilisant CAT ou AWK pour une meilleure exécution

Voici le premier:

#!/bin/bash 


     lines=$(cat /etc/passwd | wc -l) 

     for ((i=1 ; i <=$lines ; i++)) 
     do 
     user=$(cat /etc/passwd | awk -F : -vi=$i 'NR==i {print $1}') 
     uid=$(cat /etc/passwd | awk -F : -vi=$i 'NR==i {print $3}') 
     gid=$(cat /etc/passwd | awk -F : -vi=$i 'NR==i {print $4}') 
     shell=$(cat /etc/passwd | awk -F : -vi=$i 'NR==i {print $7}') 
     echo -e "User is : $user \t Uid is : $uid \t Gid is : $gid \t Shell is : $shell" 
     done 

Voici le second:

#!/bin/bash 


     lines=$(awk 'END {print NR}' /etc/passwd) 

     for ((i=1 ; i <=$lines ; i++)) 
     do 
     user=$(awk -F : -vi=$i 'NR==i {print $1}' /etc/passwd) 
     uid=$(awk -F : -vi=$i 'NR==i {print $3}' /etc/passwd) 
     gid=$(awk -F : -vi=$i 'NR==i {print $4}' /etc/passwd) 
     shell=$(awk -F : -vi=$i 'NR==i {print $7}' /etc/passwd) 
     echo -e "User is : $user \t Uid is : $uid \t Gid is : $gid \t Shell is : $shell" 
     done 

Le temps pris pour le premier script est le suivant (script avec des instructions CAT):

real 0m0.215s 
user 0m0.023s 
sys  0m0.238s 

Pour le deuxième script qui n'a que des instructions AWK, le temps pris est le suivant:

real 0m0.132s 
user 0m0.013s 
sys  0m0.123s 

Je pense que le traitement de fichier awk est beaucoup plus rapide par rapport à l'appel d'une autre fonction externe pour lire les fichiers. Je serais heureux d'avoir une discussion sur les résultats.

Je pense que AWK fonctionne mieux dans certains cas.

Ceci est au sujet de cette question ici:

https://askubuntu.com/questions/564944/cat-vs-grep-vs-awk-command-get-the-file-content-which-one-is-more-efficient-and/801569#801569

+1

Etes-vous conscient de cela: http://porkmail.org/era/unix/award.html? – cdarke

Répondre

8

clairement:

lines=$(cat /etc/passwd | wc -l) 

est moins efficace que ceci:

lines=$(awk 'END {print NR}' /etc/passwd) 

Pour un fichier de cette taille, le coût d'exécution de chaque processus est significatif par rapport à la procédure temps d'analyse.

Cependant, aucune de ces approches n'est idéale. Si vous voulez obtenir la longueur d'un fichier, utilisez simplement wc -l < file.

Quoi qu'il en soit, la boucle serait beaucoup plus rapide écrit en un seul programme awk comme celui-ci:

awk -F: '{ 
    printf "User is : %s \t Uid is : %s \t Gid is : %s \t Shell is : %s\n", 
    $1, $3, $4, $7 
}' /etc/passwd 

Vous pouvez obtenir de meilleures performances en utilisant print au lieu de printf.

awk -F: '{ 
    print "User is : " $1 " \t Uid is : " $3 " \t Gid is : " $4 " \t Shell is : " $7 
}' /etc/passwd 
+0

Salut Tom, Je suis d'accord que ce qui suit serait plus mieux 'awk -F:' { printf "L'utilisateur est:% s \ t UID est:% s \ t Gid est:% s \ t Le shell est: % s \ n ", $ 1, $ 3, $ 4, $ 7 } '/ etc/passwd' Je demandais en général si l'utilisation de la fonction intégrée d'une fonction est beaucoup mieux par rapport à d'autres choses. Par exemple, dans une boucle en bash, nous avons différentes façons: 'pour ((i = 1; i

+1

@Himanshu Il est difficile de généraliser à propos de ce genre de chose mais là encore, la différence de performance entre chacune de ces approches est susceptible d'être négligeable par rapport au coût d'appel de programmes externes dans la boucle. En outre, l'utilisation d'un seul outil conçu pour traiter des fichiers entiers (tels que awk) sera dans la plupart des cas plus rapide que l'utilisation de boucles shell. –

+0

Merci tom pour votre réponse. –