Meine Frage ist nicht einfach zu fragen ist, versuche ich das Problem mit dem folgenden Beispiel erläutern:Zählen grep Ergebnis arbeiten gewohnt in Bash-Skript
/home/luther/tipical_surnames.txt
Smith
Johnson
Williams
Jones
Brown
#Davis
Miller
Wilson
#Moore
Taylor
Anderson
/home /luther/employers.txt
2000 Johnson A lot-of details/BJC3000,6000, i550 0
2101 Smith A lot-of details/BJC3000,6000, i550 0
2102 Smith A lot-of details/BJC3000,6000, i550 0
2103 Jones A lot-of details/BJC3000,6000, i550 0
2104 Johnson A lot-of details/BJC3000,6000, i550 0
2100 Smith A lot-of details/BJC3000,6000, i550 0
habe ich eine Liste mit den beliebtesten Familiennamen und ein anderer mit dem Namen der Arbeitgeber. Lassen Sie uns prüfen, wie viele Menschen die beliebtesten Namen in der Gesellschaft haben, Konsole:
grep -v "#" /home/luther/tipical_surnames.txt | sed -n 1'p' | cut -f 1
Smith
grep Smith /home/luther/employers.txt | wc -l
230
Arbeit perfekt. können Sie nun die ersten 5 beliebtestenen Namen überprüfen, einen einfachen Bash-Skript verwenden:
#!/bin/bash
counter=1
while [ $counter -le 5 ]
do
surname=`grep -v "#" /home/luther/tipical_surnames.txt | sed -n "$counter"'p' | cut -f 1`
qty=`grep "$surname" /home/luther/employers.txt | wc -l`
echo $surname
echo $qty
counter=$(($counter + 1))
done
Und das Ergebnis den folgt:
Smith
0
Johnson
0
Williams
0
Jones
0
Brown
0
Was ist falsch?
Update: Wie ich geschrieben habe ich das Skript auf anderen Computer getestet und alles funktioniert gut. Nachdem ich versuche, die folgen:
[email protected]:/var/www# cat testfile.bash
#!/bin/bash
for ((c=1; c<=5; c++))
{
echo $c
}
[email protected]:/var/www# bash testfile.bash
testfile.bash: line 2: syntax error near unexpected token `$'\r''
'estfile.bash: line 2: `for ((c=1; c<=5; c++))
[email protected]:/var/www# echo $BASH_VERSION
4.2.37(1)-release
[email protected]:/var/www#
Natürlich auf anderen Computern dies einfach Skript wie erwartet funktionieren, ohne Fehler.
Eine Shell ist eine Umgebung, aus der Werkzeuge aufgerufen werden können, kein Werkzeug zum Bearbeiten von Text. Das Standard-Universal-UNIX-Tool zum Bearbeiten von Text ist awk. Sie haben Probleme, weil Sie das falsche Tool verwenden und es wäre immens kompliziert und ineffizient, das zu tun, was Sie in der Shell robust machen wollen (siehe [why-is-using-a-shell-loop-to-process-text- schlechtes Üben] (http://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice)). Wirf es weg und beginne mit awk. Präzise, testbare Beispieleingabe und erwartete Ausgabe können wir Ihnen helfen. –
Ich vermute, Sie haben eine Datei mit DOS-Zeilenenden. Sie sehen sie nicht beim Kopieren/Einfügen von Programmausgaben, aber sie werden in der erfassten Variablen vorhanden sein und verhindern, dass das letzte 'grep' irgendwas ergibt. Probieren Sie 'dos2unix' für die Dateien aus. Zur weiteren Problembehandlung enthält das [Stack Overflow 'bash'-Tag-Wiki] (// stackoverflow.com/tags/bash/info) einen detaillierten Abschnitt zu diesem Problem. – tripleee
@Ed Morton Ok, es ist klar, aber ich verstehe immer noch nicht, warum mein Code gut sein wird, wenn ich die $ Nachname-Variable zu einem Wert ersetze. Wie Sie aus dem Ergebnis sehen können, hat die Variable $ name einen guten Wert, wenn ich sie auf den Bildschirm ausgeben möchte. Warum funktioniert dieselbe Variable nicht, wenn ich die Variable $ qty deklariere? – Luther