指定された入力に対して.txtファイルを検索し、見つかった場合は行全体を印刷します。

指定された入力に対して.txtファイルを検索し、見つかった場合は行全体を印刷します。

入力ファイル私の.txtファイルには次の内容が含まれています。

Tom Thatcher's Fortune, by Horatio Alger, Jr.                   56896
Paradise Lost, by John Milton                                      20

最初の文字列は本のタイトル、2番目の文字列は著者、最後の文字列は本の番号です。誰かが本番号を検索した場合(本番号が一致する場合)、行全体を印刷したいと思います。私は初めてbashスクリプトに触れました。

答え1

それはまるで

grep BOOKNUMBER textfile.txt

この問題は解決する必要があります。

The Fortunes of Tom Thatcherもリストされている96冊を検索したくない場合は、以下を使用してください。

grep '[[:space:]]BOOKNUMBER[[:space:]]*$' textfile.txt

代わりに。


スクリプトとして(別名で保存searchbook

#!/bin/bash

BOOKFILE=/path/to/bookfile.txt

BOOK=$1
if [[ -z "$BOOK" ]]; then 
    echo -n "Booknumber? "
    read BOOK
fi

grep '[[:space:]]'$BOOK'[[:space:]]*$' $BOOKFILE

だからあなたは実行することができます

searchbook BOOKNUMBER

または

searchbook

2番目のケースでは、数字を入力するように求められます。

答え2

次の目的で使用できますgrep

grep 56896 file.txt

スクリプトを作成するには、次のようにします。

#!/bin/bash

inputfile='/path/to/file.txt'

grep "$1" "$inputfile"

次に、次のように実行します。

$ ./script.sh 56896

答え3

196book#でbook#をキャプチャしないようにするには、似ていますが96より簡潔な使い方をお勧めしますgrep

grep ' 96$' file.txt

正規表現の記号は$「テキスト例の終わり」を表し、正しい行でのみ一致します。

これはスクリプトに入れることもできます。

#!/bin/bash

grep " ${1}\$" /path/to/file.txt

これは次の方法でより安全に行うこともできますawk

awk -v book=96 '$NF == book {print}' file.txt

答え4

最後の単語が何であるかを印刷するために、私は次のようにawk考えました。

awk '$NF == "123"' # string comparison
awk '$NF == 123'   # number comparison, would also match on 0123, 123.0, 1.23e2
awk '$NF == ENVIRON["ENVVAR"]' # number comparison if both $NF and $ENVVAR
                               # look like numbers, string otherwise

awkその人のために性格デフォルトではスペースで区切ります。実装によって異なるスペース単に空白またはタブにすることができ、一部はロケールで分類されている場合は他のUnicode空白文字を含めることもできます。実装busybox awkには、キャリッジリターン文字を含む垂直空白文字も含まれます。

ファイルがLFの代わりにCR LF文字シーケンスであるMS-DOS行区切り文字を使用してフォーマットされている場合、busybox awkを除いて上記の方法は機能しません。 busybox awkを使用しても、出力行にはUnixには表示されない問題のある制御文字がまだ含まれています。

dos2unixd2uしたがって、行末をUnix形式に変換するには、入力を使用または前処理する必要があります。

< file.dos dos2unix | awk '$NF == 123'

入力ファイルは、空白行で区切られたレコードで構成されているように見えます。 ISBNの完全な履歴を印刷するには:

export BOOKNUMBER=123
< file.dos dos2unix | awk -v RS= -F '\n' '
    field[split($1, field, " ")] == ENVIRON["BOOKNUMBER"]'

そこに我々が設定記録区切り記号 空の文字列を入力してください。短絡モード(空行で区切られたレコード)とフィールド区切り記号改行文字(LFとも呼ばれる)なので、各レコードの最初の行は$1(最初のフィールド)にあります。最初の行を特別な行から切り離し、" "デフォルトを使用します。言葉field配列に分割します。その配列の最後の要素(split()要素の数を返すため、field[split()]最後の要素も同様です)は環境変数の内容と比較されます$BOOKNUMBER

関連情報