入力ファイル私の.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
196
book#で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には表示されない問題のある制御文字がまだ含まれています。
dos2unix
d2u
したがって、行末を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
。