web-dev-qa-db-ja.com

シェルスクリプトのみを使用してテキストファイルから特定の行を取得する

テキストファイルから特定の行を取得しようとしています。

これまでのところ、オンラインではsedのようなものしか見ていません(sh-not bashやsedなどは使用できません)。基本的なシェルスクリプトを使用してのみこれを行う必要があります。

cat file | while read line
    do
       #do something
    done

上記のように行を反復処理する方法は知っていますが、特定の行の内容を取得する必要がある場合はどうすればよいですか

76
GangstaGraham

sed:

sed '5!d' file

awk:

awk 'NR==5' file
159
Kent

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

sed -n 5p fileを使用できます。

範囲を取得することもできます(例:sed -n 5,10p file)。

15
nomasprime

私は通常、この目的のためにこれを使用します:

sed '5q;d' file

7
faithonour

たとえば、ファイルの行10〜20を取得する場合は、次の2つの方法を使用できます。

head -n 20 york.txt | tail -11

または

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

上記のコマンドのpは印刷を表します。

表示される内容は次のとおりです。 enter image description here

3
Mona Jalal

この種のことを行う標準的な方法は、外部ツールを使用することです。シェルスクリプトの作成中に外部ツールの使用を禁止するのはばかげています。ただし、実際に外部ツールを使用したくない場合は、次のように5行目を印刷できます。

i=0; while read line; do test $((++i)) = 5 && echo "$line"; done < input-file

これにより、論理行5が出力されることに注意してください。つまり、input-fileに行の継続が含まれる場合、それらは単一行としてカウントされます。この動作を変更するには、-rを読み取りコマンドに追加します。 (おそらく望ましい動作です。)

2
William Pursell

Perlで簡単!ファイルから1行目、3行目、5行目を取得したい場合は、/ 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

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がループ外に最適化されることにも注意してください。

0
tripleee