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


10

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

:タイムスタンプの最初の位置にあるを削除するのを手伝ってくれる人はいますか::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

回答:


14

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

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

11

使用する

cut -d: -f2-

の代わりに

cut -d: -f2

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

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

8

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

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

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

これは印刷されます:

29.06.2019 23:03:17

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

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

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


3
+1これ!質問には「bash」というタグが付いているため、外部ツールをロードするよりもはるかに高速な文字列操作のbashの優れた(多くの場合は非常にあいまいです)機能を好むと考える必要があります。
rexkogitans

2
@rexkogitansすでにファイルを解析するためにgrepまたはawkを呼び出しているため、bashは速くなりません。実際、ファイルを解析する必要があるときはいつでもbashは遅くなります。すべてのシェルは低速で、bashはほとんどのシェルよりも低速です。とは言っても、シェルの文字列操作機能は実際には多くの場合最良のアプローチですが、変数としての入力が既にある場合に限られます。
terdon

8

これが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

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

$ 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は、拡張正規表現を有効にします。オプション-nはの通常の出力を抑制し、sed最後にコマンドpは一致を出力します。


awk特別な意味を持つ文字を含むマルチ文字FSができることを知りませんでした!今日学んだこと。
Floris

6

これは既にで処理し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"

0

別の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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.