質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

Q&A

解決済

3回答

11487閲覧

シェルスクリプトで、ファイルに特定の文字列を含むかgrepしたい

umino

総合スコア54

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

0グッド

0クリップ

投稿2020/03/05 07:35

前提・実現したいこと

テキストファイル(変数targetFile)に、特定の文字列(定数HOGE)が含まれているかをgrepしたいです。
含まれている場合は標準出力に"含みます"を、そうでない場合は"含みません"を表示したいです。

sh

1$ cat test.sh 2#!/bin/bash - 3 4targetFile="/home/testuser1/plainText.txt" 5HOGE="foo and bar" 6 7if [ "$(echo ${targetFile} | grep "${HOGE}" )" ] ;then 8 echo "含みます" 9else 10 echo "含みません" 11fi

console

1$ cat /home/testuser1/plainText.txt 2hoge 3fuga 4foo and bar 5piyo

上記の場合、plainText.txtには特定の文字列「foo and bar」が含まれているので、
シェルスクリプトの実行結果は「含みます」になると思いました。
しかし実行結果は下記の通り、★マークのあたりでうまくいっていないように思います。

console

1$ sh -xv test.sh 2#!/bin/bash - 3 4dir="/home/testuser1/plainText.txt" 5+ dir=/home/testuser1/plainText.txt 6HOGE="foo and bar" 7+ HOGE='foo and bar' 8 9if [ "$(echo ${dir} | grep "${HOGE}" )" ] ;then 10 echo "含みます" 11else 12 echo "含みません" 13fi 14++ echo /home/testuser1/plainText.txt 15++ grep 'foo and bar' 16+ '[' '' ']' ★grepができていないよう 17+ echo 含みません 18含みません

こちらについて、おそらくifまわりのクォーテーションを正しく書けていないせいと踏んでいるのですが、
具体的にどう書けば解決できるのかがわかりません。
お詳しい方、ご教示願えませんでしょうか。
よろしくおねがいします。

補足情報(FW/ツールのバージョンなど)

bash
CentOS7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

お書きの方法でもできますが、普通はgrepのステータスコード(完了コード)を見ます。

sh

1if grep -q "${HOGE}" "${targetFile}" ;then

-qはマッチした行を出力しないというオプションです(Linux等のGNU grepでは)。

投稿2020/03/05 14:50

otn

総合スコア84505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2020/03/05 15:47

> お書きの方法でもできますが、 と書きましたが、ファイルサイズが大きくて、${HOGE}の含まれる行数も多い場合、 if [ "~~~~~" ] の引用符の中がBashが扱える行サイズを越えるかもしれません。ギガバイト単位だったりとか。
umino

2020/03/08 23:39

otnさん 返信遅れ失礼しました。 grepだけで扱う方法がメジャーなんですね。確かに、普段CLIから検索するときはそのようにしています。 実装完了してしまったのですが、次回はその方法で、よりシンプルに記述するようにします。 (ファイルサイズについては、特別大きいものを扱わないので大丈夫そうです、注意喚起ありがとうございます。) 回答ありがとうございました。
guest

0

sh

1#!/bin/sh 2 3targetFile="/home/guest//bin/hoge" 4 5HOGE="foo and bar" 6 7if [ "$(cat ${targetFile} | grep "${HOGE}" )" ] ;then 8 echo "含みます" 9else 10 echo "含みません" 11fi

で、含みますと表示されました。

投稿2020/03/05 07:49

nanami12

総合スコア1015

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nanami12

2020/03/05 07:50

あ もう先に回答されてるかたが いましたね・・・
umino

2020/03/05 07:54

nanami12さん、ご回答ありがとうございます。 catでしたね、コマンドの意味を理解しないまま進めてしまっていました。 勉強になりました。ご回答、ありがとうございます。
nanami12

2020/03/05 08:06

いえいえ 私も よく 間違うことがあります。 日々勉強です 笑
guest

0

ベストアンサー

こんにちは。
echo ではなく cat ですね。

if [ "$(cat ${targetFile} | grep "${HOGE}" )" ] ;then

投稿2020/03/05 07:42

DreamTheater

総合スコア1095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

umino

2020/03/05 07:53

こんにちは。 さっそくのご回答ありがとうございます。 教えていただいたとおりに試したところ、期待した結果が得られました。 catで読み込んで、grepですね、初歩的なミスお恥ずかしいです。 コマンドの動作を理解して書くようにします。 助かりました、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問