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

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

新規登録して質問してみよう
ただいま回答率
85.49%
シェルスクリプト

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

grep

grepはコマンドライン上でテキスト検索を可能にするユーティリティーです。元はUnixのために用意されたものです。

Linux

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

シェル

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

9464閲覧

Linuxでgrepの正規表現を利用中に引数$1を渡す

JuvenileJun

総合スコア5

シェルスクリプト

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

grep

grepはコマンドライン上でテキスト検索を可能にするユーティリティーです。元はUnixのために用意されたものです。

Linux

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

シェル

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2019/09/15 04:45

Linuxでgrepの正規表現を利用中に引数$1を渡す方法についてご教授下さい

いつもお世話になっています。
現在、Linuxで動作するシェルスクリプトを作成しております。
当シェルスクリプトですが、タブを含むtsvテキストファイルに含まれるキーワードに対してgrepの正規表現で抽出したいと考えております。
その際にキーワードはシェルに引数で渡したいと考えております。

grepの正規表現内に引数「$1」を利用したいのですが、正規表現の行末を表す「$」と認識されており正しく機能しておりません。

シェルスクリプトの内容を以下に掲載しますので、
どなたか詳しい方、ご教授いただけますでしょうか。よろしくお願いします。

発生している問題

grep でキーワードを抽出したいが引数「$1」の「$」部分が正規表現の行末を表す「$」と同じようで正しく抽出されておりません

該当のソースコード

以下、作ったシェルスクリプトです
(説明のため簡略化してあります)
タブ区切りで4つの単語が並んでおり、2つ目の単語のキーワード(数字)を引数で渡したいと考えております。
実行パターン1 sh test.sh
実行パターン2 sh test.sh キーワード(数字)

test.sh 引数 $1 パターン1(引数なしでキーワードを直接入力) cat test.tsv | grep $'^[^\t]*\t[キーワード]*\t[^\t]*\t[^\t]*' パターン2(引数で渡す) cat test.tsv | grep $'^[^\t]*\t[$1]*\t[^\t]*\t[^\t]*'

試したこと

上記のパターン1ですと、直接入力しているので抽出可能です。
上記のパターン2ですと「$」部分が末尾として認識されているようで抽出が出来ておりません。

実現したいこと

上記パターン2の引数を渡す形で実現したいのですが私の技術力が乏しく、引数の適切な渡し方が分かっておりません。

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

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

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

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

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

guest

回答2

0

$'~~'の中でシェル変数は展開されません。

sh

1cat test.tsv | grep $'^[^\t]*\t['"$1"$']*\t[^\t]*\t[^\t]*'

と、一度$'~~'の外に出る必要があります。

投稿2019/09/15 06:10

otn

総合スコア84487

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

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

JuvenileJun

2019/09/15 07:08

回答頂きありがとうございます。 まだまだLinux及びシェルを勉強中の身で、大変助かります。 今後シェルスクリプトを使う機会が結構出てきそうなので、基礎知識の補充を行いたいなと思います!
guest

0

ベストアンサー

シングルコーテーションで囲った中では変数は展開されないのでダブルコーテーションで囲うか、文字列をいったん終了してください。

cat test.tsv | grep $"^[^\t]*\t[$1]*\t[^\t]*\t[^\t]*"
cat test.tsv | grep $'^[^\t]*\t['$1']*\t[^\t]*\t[^\t]*"
などです。

スクリプト実行時に-xをつけておくとどう展開されているか観測できます。
bash -x test.sh

投稿2019/09/15 04:57

nomuken

総合スコア1627

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

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

JuvenileJun

2019/09/15 06:09

回答頂きありがとうございます。 教えて頂いた文字列を一旦終了する方法で、引数が正しく認識するようになりました。 また -x のオプションについても大変勉強になりました。
otn

2019/09/15 06:09

\t は $'~~' の中でないとタブになりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問