テキストファイルから特定の行を取得しようとしています。
これまでのところ、オンラインではsedのようなものしか見ていません(sh-not bashやsedなどは使用できません)。基本的なシェルスクリプトを使用してのみこれを行う必要があります。
cat file | while read line
do
#do something
done
上記のように行を反復処理する方法は知っていますが、特定の行の内容を取得する必要がある場合はどうすればよいですか
sed:
sed '5!d' file
awk:
awk 'NR==5' file
line
が必要な行番号を保持する変数であると仮定すると、head
およびtail
を使用できる場合、それは非常に簡単です。
head -n $line file | tail -1
そうでない場合、これは動作するはずです:
x=0
want=5
cat lines | while read line; do
x=$(( x+1 ))
if [ $x -eq "$want" ]; then
echo $line
break
fi
done
sed -n 5p file
を使用できます。
範囲を取得することもできます(例:sed -n 5,10p file
)。
私は通常、この目的のためにこれを使用します:
sed '5q;d' file
この種のことを行う標準的な方法は、外部ツールを使用することです。シェルスクリプトの作成中に外部ツールの使用を禁止するのはばかげています。ただし、実際に外部ツールを使用したくない場合は、次のように5行目を印刷できます。
i=0; while read line; do test $((++i)) = 5 && echo "$line"; done < input-file
これにより、論理行5が出力されることに注意してください。つまり、input-file
に行の継続が含まれる場合、それらは単一行としてカウントされます。この動作を変更するには、-r
を読み取りコマンドに追加します。 (おそらく望ましい動作です。)
Perlで簡単!ファイルから1行目、3行目、5行目を取得したい場合は、/ 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:}"
William Pursell's answer と並行して、元のv7 Bourne Shell(およびBashが利用できない場所)でも動作するはずの簡単な構造を次に示します。
i=0
while read line; do
i=`expr "$i" + 1`
case $i in 5) echo "$line"; break;; esac
done <file
また、探している行を取得したときに、break
がループ外に最適化されることにも注意してください。