🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
シェルスクリプト

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

シェル

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

Q&A

3回答

399閲覧

テキストファイルから特定の部分を取り出したい

114514810

総合スコア4

シェルスクリプト

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

シェル

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

0グッド

0クリップ

投稿2019/11/12 05:27

前提・実現したいこと

ubuntuのシェルスクリプトについてです。
あるログが書かれたテキストファイルから日時の部分だけを取り出したいです。
初心者なので色々調べながら行っているのですがエラーが出ていてよくわかりません。

ログには各行に
/home/user/test/114514.JPG 11/11/19_20:00:01[[ 0.364 0.364 0.1919]]
といった内容が表示されています。
このうち11/11/19_20:00:01の部分を取り出したいです。
.JPGの前は色々変わるのでその部分を利用しようと思い以下のコードを試してみました。

該当のソースコード

Shell

1c=`echo "${a}" | sed -e "s/^.*JPG \JPG .*[[.*$/\1/"`

ログの一行がaの中に入っています。

発生している問題・エラーメッセージ

sed: -e expression #1, char n: `s' コマンドが終了していません nの部分は数字です。

どのように改善する、もしくはどのような記述であれば日時を取り出せますか。
ご教示ください。お願いします。

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

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

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

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

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

guest

回答3

0

以下例外とかの処理にはあまり対応できないです。(ログの形式が決まってるようなので問題ないような気がします。)

日付の形式の正規表現を指定して「grep -o」で取り出すとか、

terminal

1$ c=`echo "/home/user/test/114514.JPG 11/11/19_20:00:01[[ 0.364 0.364 0.1919]]" | grep -o [0-9][0-9]/[0-9][0-9]/[0-9][0-9]_[0-9][0-9]:[0-9][0-9]:[0-9][0-9]` ; echo $c 211/11/19_20:00:01

フィールドセパレータを無理やり設定して(空白または'['をフィールドセパレータにする)、2列目を取り出すとか、

terminal

1$ c=`echo "/home/user/test/114514.JPG 11/11/19_20:00:01[[ 0.364 0.364 0.1919]]" | awk -F '[ []+' '{print $2}'` ; echo $c 211/11/19_20:00:01

投稿2019/11/12 06:14

hidezzz

総合スコア1248

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

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

0

必要な部分([0-9/:_]*)を抜き出すか

sed -e 's#^.*.JPG ([0-9/:_]*)[.*#\1#g'

不要な部分( ^.*.JPG , [.* )を削除するか

sed -e 's/^.*.JPG //g' -e 's/[.*//g'
$ echo "/home/user/test/114514.JPG 11/11/19_20:00:01[[ 0.364 0.364 0.1919]]" | sed -e 's#^.*.JPG ([0-9/:_]*)[.*#\1#g' 11/11/19_20:00:01 $ echo "/home/user/test/114514.JPG 11/11/19_20:00:01[[ 0.364 0.364 0.1919]]" | sed -e 's/^.*.JPG //g' -e 's/[.*//g' 11/11/19_20:00:01

投稿2019/11/12 05:57

編集2019/11/12 06:17
Y.H.

総合スコア7918

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

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

0

[はメタチャラクタなのでエスケープしなければなりませんが、出来ていません。これがエラーの直接的な原因です。

これ以外にも幾つか意図不明な記述が見られますが、質問の意図では、前半部分の削除ができれば良く後半部分のマッチングは考えなくていいので、

sed -e "s/^.*JPG *//"

でいいはずです。

投稿2019/11/12 05:46

KojiDoi

総合スコア13692

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問