it-swarm.com.de

Holen Sie sich eine bestimmte Zeile aus einer Textdatei, indem Sie nur ein Shell-Skript verwenden

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

70
GangstaGraham

sed:

sed '5!d' file

awk:

awk 'NR==5' file
147
Kent

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
15
micromoses

Sie könnten sed -n 5p file verwenden.

Sie können auch einen Bereich abrufen, z. B. sed -n 5,10p file.

12
nomasprime

Ich verwende das normalerweise für diesen Zweck:

sed '5q;d' file

4
faithonour

Wenn Sie beispielsweise die Zeilen 10 bis 20 einer Datei erhalten möchten, können Sie jede der beiden Methoden verwenden:

head -n 20 york.txt | tail -11

oder 

sed -n '10,20p' york.txt 

p im obigen Befehl steht für das Drucken.

Folgendes werden Sie sehen:  enter image description here

3
Mona Jalal

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.)

2
William Pursell

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
0
dagelf
line=5; prep=`grep -ne ^ file.txt | grep -e ^$line:`; echo "${prep#$line:}"
0
Oder

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.

0
tripleee