こんにちは、さるまりんです。
今回はファイルを一行ずつ読み込んで特定の文字列で終わる行だけ出力するシェルスクリプトを書いてみます。
まずはファイルを一行ずつ読み込んで全ての行を出力するスクリプトです。
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.txt
でr
で終わる行だけを出力してみます。
$ ./endswith.sh random1.txt r
beginner
fair
partner
zephyr
e
だと
$ ./endswith.sh random1.txt e
inquisitive
choke
別のテキストファイルrandom2.txt
のr
で終わる行だけ出力してみます。
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
の行だけ出力されていますね。
変数ENDWITH
とif
の書き方をどうするかで抽出する文字列を変えることができますね。
grep
などを使ってファイルの中の特定行を出力することはよくあります。
わざわざスクリプトを書くことはあまりないのかもしれないですが、複雑な正規表現が浮かばないなど、シェルスクリプトの方が楽な時もあるように思います。
同じことでもいろんな方法があるのでやりやすくわかりやすいものを適切に選んでいけるようになりたいです。
読んでくれてありがとうございました。
それではまた!