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

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

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

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

Linux

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

Q&A

解決済

3回答

856閲覧

【Linux】文字のフォーマットについて

退会済みユーザー

退会済みユーザー

総合スコア0

sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

Linux

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

0グッド

1クリップ

投稿2020/05/03 10:39

実現したいこと

$ last -F reboot
にて、wtmpが作成された時間を基にシステムが "初めて起動" された時刻を確認したいです。

そのため、以下のように sed で文字列を抽出し、
文字列の順番を入れ替えた後、フォーマットを行いたいです。

1.下記コマンドで文字列を抽出 $ last -F reboot | sed -n 's/wtmp begins.....//p' 抽出された文字列 Feb 26 00:44:16 2020 2.文字列の順番を入れ替える Feb 26 00:44:16 2020 ↓ 順番入れ替え 2020 Feb 26 00:44:16 3.フォーマットを行う 2020 Feb 26 00:44:16 ↓ フォーマット 2020-Feb-26-00h44m16s

上記の文字列を取得します。

しかし、以下のような日にちが2桁とならない場合に[0]をつけるようにしたいです。

Mar 2 15:03:22 2020 ↓ 0を付与 (2の前にあるスペースを0に置換) Mar 02 15:03:22 2020 ↓ フォーマット 2020-Mar-02-15h03m22s

また、可能であれば月の英語も数字に変更を行いたいです。

Jan → 01 Feb → 02 Mar → 03 Apr → 04 May → 05 Jun → 06 Jul → 07 Aug → 08 Sep → 09 Oct → 10 Nov → 11 Dec → 12

最終的には以下のようなフォーマットになることが理想です。

2020-02-26-00h44m16s

初歩的なLinuxコマンドは使用できますが、
いまの知識だとあまりにもShellが冗長であるため
スマートに実現が可能であればご意見いただけると幸いです。

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

OS:Amazon Linux2

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

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

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

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

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

takasima20

2020/05/03 11:29

awk かなんかでやれば?
guest

回答3

0

ベストアンサー

date -dを使います。

Bash

1boot_time=$(date -d "$(last -F reboot | sed -n 's/wtmp begins//p')" "+%F-%Hh%Mm%Ss") 2 3echo $boot_time

投稿2020/05/03 12:39

otn

総合スコア84423

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

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

退会済みユーザー

退会済みユーザー

2020/05/03 13:58

ご回答ありがとございます! ワンライナーでできてしまうんですね。。 date -d(--date)について、調べてみましたが指定した文字列の時刻がフォーマットに合うものであれば 渡す文字列がどんな順序であっても認識できるんですね。 感嘆してしまいました・・・。
guest

0

日付データのフォーマット変換を行いたいなら、dateコマンドを使うのが合理的でしょう。

echo 'Feb 26 00:44:16 2020' | date -f - '+%Y-%m-%d-%hh%mm%ss'

投稿2020/05/03 12:30

KojiDoi

総合スコア13669

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

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

退会済みユーザー

退会済みユーザー

2020/05/03 14:05 編集

ご回答ありがとうございます。 当環境では、ご教授いただいたコマンドでは出力崩れがあるようです。。 $ echo 'Feb 26 00:44:16 2020' | date -f - '+%Y-%m-%d-%hh%mm%ss' 2020-02-26- 2月h02m1582645456s そのため、下記に修正したところ無事表示されました。 $ echo 'Feb 26 00:44:16 2020' | date -f - '+%Y-%m-%d-%Hh%Mm%Ss' 2020-02-26-00h44m16s こちらの方法でもワンライナーで実現可能であることがわかりました! ありがとございました!
guest

0

スマートかわかりませんが…

bash

1#!/bin/bash 2 3function tuki() { 4 echo $1 | sed 's/Jan/01/;s/Feb/02/;s/Mar/03/;s/Apr/04/;s/May/05/;s/Jun/06/;s/Jul/07/;s/Aug/08/;s/Sep/09/;s/Oct/10/;s/Nov/11/;s/Dec/12/' 5} 6 7function hi() { 8 printf '%02d' $1 9} 10 11function jikan() { 12 echo $1 | tr ':' ' ' | (\ 13 read h m s 14 echo "${h}h${m}m${s}s" 15 ) 16} 17 18last -F reboot | sed -n 's/wtmp begins.....//p' | (\ 19read m d hms y 20echo "${y}-`tuki $m`-`hi $d`-`jikan $hms`" 21)

投稿2020/05/03 12:20

takasima20

総合スコア7458

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

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

退会済みユーザー

退会済みユーザー

2020/05/03 14:14

ご回答ありがとうございます! 順を追って理解できるので、とてもいいですね。 今回はワンライナーで、dateコマンドを使用したフォーマットがあるようで そちらをベストアンサーにさせていただきましたが、 takasima20さんにご教授いただいたShellは他の用途でも応用できそうなので どこかで使用させていただければと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問