Ich versuche, eine bestimmte Zeile aus einer Textdatei zu erhalten.
Bisher habe ich online nur Sachen wie sed gesehen (ich kann nur sh -not bash oder sed oder ähnliches verwenden). Ich muss dies nur mit einem einfachen Shell-Skript tun.
cat file | while read line
do
#do something
done
Ich weiß, wie man durch Zeilen iteriert, wie oben gezeigt, aber wenn ich nur den Inhalt einer bestimmten Zeile erhalten muss
sed:
sed '5!d' file
awk:
awk 'NR==5' file
Angenommen, line
ist eine Variable, die Ihre erforderliche Zeilennummer enthält. Wenn Sie head
und tail
verwenden können, ist das ganz einfach:
head -n $line file | tail -1
Wenn nicht, sollte dies funktionieren:
x=0
want=5
cat lines | while read line; do
x=$(( x+1 ))
if [ $x -eq "$want" ]; then
echo $line
break
fi
done
Sie könnten sed -n 5p file
verwenden.
Sie können auch einen Bereich abrufen, z. B. sed -n 5,10p file
.
Ich verwende das normalerweise für diesen Zweck:
sed '5q;d' file
Die Standardmethode für diese Art der Verwendung besteht darin, externe Werkzeuge zu verwenden. Es ist absurd, die Verwendung externer Tools beim Schreiben eines Shell-Skripts zu verbieten. Wenn Sie jedoch keine externen Tools verwenden möchten, können Sie Zeile 5 mit folgenden Anweisungen drucken:
i=0; while read line; do test $((++i)) = 5 && echo "$line"; done < input-file
Beachten Sie, dass dadurch die logische Zeile 5 gedruckt wird. Wenn input-file
Zeilenfortsetzungen enthält, werden sie als einzelne Zeile gezählt. Sie können dieses Verhalten ändern, indem Sie -r
zum Befehl read hinzufügen. (Welches ist wahrscheinlich das gewünschte Verhalten.)
Einfach mit Perl! Wenn Sie die Zeilen 1, 3 und 5 aus einer Datei erhalten möchten, sagen Sie/etc/passwd:
Perl -e 'while(<>){if(++$l~~[1,3,5]){print}}' < /etc/passwd
line=5; prep=`grep -ne ^ file.txt | grep -e ^$line:`; echo "${prep#$line:}"
Parallel zu William Pursells Antwort gibt es hier ein einfaches Konstrukt, das selbst in der ursprünglichen Bourne-Shell (und damit auch Stellen, an denen Bash nicht verfügbar ist) funktionieren sollte.
i=0
while read line; do
i=`expr "$i" + 1`
case $i in 5) echo "$line"; break;; esac
done <file
Beachten Sie auch die Optimierung auf break
außerhalb der Schleife, wenn wir die gesuchte Zeile erhalten haben.