シェルスクリプトでファイルの特定の文字列で終わる行だけ出力する方法

こんにちは、さるまりんです。

今回はファイルを一行ずつ読み込んで特定の文字列で終わる行だけ出力するシェルスクリプトを書いてみます。

まずはファイルを一行ずつ読み込んで全ての行を出力するスクリプトです。

readfile.sh

#!/bin/sh
FILE=$1
cat $FILE | while read LINE
do
  echo $LINE
done

一つ目の引数にファイルのパスを読み込んで、そのファイルを一行ずつ読み込みechoしているだけです。

このスクリプトにテキストファイルrandom1.txtを読ませてみます。

random1.txt

beginner
fair
look
selection
inquisitive
channel
rainstorm
gold
earth
partner
choke
zephyr

実行結果です。

$ ./readfile.sh random1.txt 
beginner
fair
look
selection
inquisitive
channel
rainstorm
gold
earth
partner
choke
zephyr

全てそのまま出力されていますね。

今度は当初の目的の特定の文字で終わる文字列だけを出力するスクリプトです。
上のスクリプトのechoしているところに「特定の文字列で終わる時だけ」の条件をつけてみます。

endswith.sh

#!/bin/sh
FILE=$1
ENDWITH="*$2"
cat $FILE | while read LINE
do
  if [[ $LINE == $ENDWITH ]]
  then
    echo $LINE
  fi
done

一つ目の引数は変わらずファイルのパス、二つ目の引数は一致するか比較する文字列です。

テキストファイルrandom1.txtrで終わる行だけを出力してみます。

$ ./endswith.sh random1.txt r
beginner
fair
partner
zephyr

eだと

$ ./endswith.sh random1.txt e
inquisitive
choke

別のテキストファイルrandom2.txtrで終わる行だけ出力してみます。

random2.txt

lively
untidy
card
blink
better
cart
trashy
arm
ugly
thank
identify
screw
$ ./endswith.sh random2.txt r
better

1行だけ出力されました。

yだと

$ ./endswith.sh random2.txt y
lively
untidy
trashy
ugly
identify

5行出力されました。

lyだと

$ ./endswith.sh random2.txt ly
lively
ugly

後ろ2文字がlyの行だけ出力されていますね。

変数ENDWITHifの書き方をどうするかで抽出する文字列を変えることができますね。

grepなどを使ってファイルの中の特定行を出力することはよくあります。
わざわざスクリプトを書くことはあまりないのかもしれないですが、複雑な正規表現が浮かばないなど、シェルスクリプトの方が楽な時もあるように思います。

同じことでもいろんな方法があるのでやりやすくわかりやすいものを適切に選んでいけるようになりたいです。

読んでくれてありがとうございました。

それではまた!