2016-07-22 37 views
-2

Ich habe zwei gleiche Skripte. In einem benutze ich Katze und in anderen ist alles AWK.Lesen Sie Dateien mit CAT oder AWK für bessere Ausführungszeit

Hier ist der erste:

#!/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 

Hier ist das zweite:

#!/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 

Die Zeit für das erste Skript genommen ist wie folgt (Skript mit CAT-Anweisungen):

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

Für das zweite Skript, das nur AWK-Anweisungen hat, ist die Zeit wie folgt:

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

Ich denke, awk Verarbeitung von Datei ist viel schneller im Vergleich zu anderen externen Funktion aufrufen, um die Dateien zu lesen. Ich würde mich für eine Diskussion über die Ergebnisse freuen.

Ich denke, AWK führt in einigen Fällen besser.

Dies ist in Bezug auf diese Frage hier:

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

+1

Sind Sie sich dessen bewusst: http://porkmail.org/era/unix/award.html? – cdarke

Antwort

8

Offensichtlich dies:

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

ist weniger effizient als das:

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

Für eine Datei dieser Größe, Die Kosten für die Durchführung jedes Prozesses sind im Vergleich zum Verfahren erheblich Zeit.

Kein Ansatz ist jedoch großartig. Wenn Sie die Länge einer Datei erhalten möchten, verwenden Sie einfach wc -l < file.

Wie dem auch sei, würde Ihre Schleife viel schneller als ein einzelner awk Programm wie folgt geschrieben werden:

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 

Man könnte sogar eine bessere Leistung erzielen, indem print statt printf verwenden.

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

Hallo Tom, Ich stimme zu, dass das Folgende besser wäre 'awk -F:' { printf "Benutzer ist:% s \ t Uid ist:% s \ t Gid ist:% s \ t Shell ist: % s \ n ", $ 1, $ 3, $ 4, $ 7 } '/ etc/passwd' Ich fragte im Allgemeinen, ob die eingebaute Fähigkeit einer Funktion ist viel besser im Vergleich zu anderen Dingen. Zum Beispiel in einem for-Schleife in bash haben wir verschiedene Möglichkeiten: 'für ((i = 1; i

+1

@Himanshu ist es schwer zu verallgemeinern über diese Art von Sache, aber dann wieder, der Unterschied in der Leistung zwischen diesen beiden Ansätze ist wahrscheinlich vernachlässigbar im Vergleich zu den Kosten für den Aufruf externer Programme innerhalb der Schleife. Darüber hinaus ist die Verwendung eines einzigen Tools zur Verarbeitung ganzer Dateien (z. B. awk) in den meisten Fällen schneller als die Verwendung von Shell-Schleifen. –

+0

Danke tom für deine Antwort. –