web-dev-qa-db-ja.com

タイムスタンプから最初のコロン「:」を削除するにはどうすればよいですか?

プログラミングは初めてです!!

タイムスタンプの最初の位置にある:の削除を手伝ってくれる人はいますか::29.06.2019 23:03:17

現在、私は以下に示すようにawk/cutコマンドを使用してそれをやろうとしています:

TDS="$(grep 'Logfile started' process.log |  awk '{print $3,$4}' | cut -d: -f2)"
echo "$TDS"


29.06.2019 23

そして、出力は私が望んだものではありません! 29.06.2019 23:03:17として印刷します。

10
Manoj Kumar

最初の文字を切り取るには、cut -cを使用することもできます。

$ echo ":29.06.2019 23:03:17" | cut -c 2-
29.06.2019 23:03:17
14
pLumo

使用する

cut -d: -f2-

の代わりに

cut -d: -f2

2番目のフィールドから行末まで何でも取得するには:

TDS="$(grep 'Logfile started' process.log |  awk '{print $3,$4}' | cut -d: -f2-)"
echo "$TDS"
11
Florian Diesch

これがsedソリューションです:

$ echo ':29.06.2019 23:03:17' | sed 's/^://'
29.06.2019 23:03:17

コマンドsed 's/^://'が行っていることは、各行の先頭:からコロン文字^を空の文字列//に置き換えたsです。

トリッキーなawkソリューションは次のとおりです。ここでは、上記のフィールドセパレーターを^:に変更し、(各行の)2番目のフィールドを出力します。

$ echo ':29.06.2019 23:03:17' | awk -F'^:' '{print $2}'
29.06.2019 23:03:17

このタスクはgrepexplanation )でも実行できます。これは、大量のデータに対する最も速い解決策になる可能性があります。

$ echo 'Logfile started :29.06.2019 23:03:17' | grep -Po '^Logfile started :\K.*'
29.06.2019 23:03:17

または、次のコマンドでファイルを直接処理します。ここで、制限^は削除されています。

grep -Po 'Logfile started :\K.*' process.log

上記は、sedおよびキャプチャグループ()->\1によっても実現できます。

sed -nr 's/^.*Logfile started :(.*)$/\1/p' process.log

^.*<something>.*$は、<something>を含む行全体と一致します。コマンドs/old/new/は、この行を最初のキャプチャグループの内容で置き換えます(括弧内の式はより具体的である可能性があります)。オプション-rは、拡張正規表現を有効にします。オプション-nsedの通常の出力を抑制し、最後にコマンドpが一致を出力します。

8
pa4080

awkはクールなツールであり、非常に複雑なタスクをそれで解決できます。しかし、あなたの質問のために、私はむしろbashの基本的な機能に固執したいと思います。

この簡単に削除するために、私は次のことを行います:

zehe="Logfile started :29.06.2019 23:03:17"
echo "${zehe#*:}"

これは印刷されます:

29.06.2019 23:03:17

私があなたの立場にいて、プログラミングとbashを学び始めたとき、私はこのハンドブックの多くを学びました:

ABS-高度なBashスクリプトガイド

問題のいくつかの例と興味深い情報が見つかります ここ 、「サブストリングの削除」を探します。

8

これはawkで既に処理しているので、全体を直接実行することもできます。

_$ echo "foo bar :29.06.2019 23:03:17" |  awk '{sub(/^:/,"",$3); print $3,$4}' 
29.06.2019 23:03:17
_

subコマンドの一般的な形式はsub(/REGEX/, REPLACEMENT, TARGET)であり、正規表現REGEXのすべての一致を、入力文字列REPLACEMENTの文字列TARGETに置き換えます。ここでは、3番目のフィールド(_:_)の最初の_^_(_$3_は「始まり」を意味します)を何も置き換えません。

もちろん、それをawkで実行している場合は、awkですべてを実行して、すべてを1つの操作で実行することもできます。

_$ echo "Logfile started :29.06.2019 23:03:17" | 
    awk '/Logfile started/{sub(/^:/,"",$3); print $3,$4}' 
29.06.2019 23:03:17
_

または、あなたの場合:

_TDS="$(awk '/Logfile started/{sub(/^:/,"",$3); print $3,$4}' process.log)"
echo "$TDS"
_
6
terdon

別のbashソリューション:

$ echo "Logfile started :29.06.2019 23:03:17" | xargs bash -c 'echo "${2#*:} $3"'
29.06.2019 23:03:17
  • これは、中間の変数割り当ての代わりにパイプラインを使用します。
  • コマンドxargsは、stdin(標準入力)をbashコマンドの定位置パラメーターに変換します。
  • echotail -n1 /path/to/reportfile.txtに置き換えます。
0