プログラミングは初めてです!!
タイムスタンプの最初の位置にある:
の削除を手伝ってくれる人はいますか::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
として印刷します。
最初の文字を切り取るには、cut -c
を使用することもできます。
$ echo ":29.06.2019 23:03:17" | cut -c 2-
29.06.2019 23:03:17
使用する
cut -d: -f2-
の代わりに
cut -d: -f2
2番目のフィールドから行末まで何でも取得するには:
TDS="$(grep 'Logfile started' process.log | awk '{print $3,$4}' | cut -d: -f2-)"
echo "$TDS"
これが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
( explanation )でも実行できます。これは、大量のデータに対する最も速い解決策になる可能性があります。
$ 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
はクールなツールであり、非常に複雑なタスクをそれで解決できます。しかし、あなたの質問のために、私はむしろbashの基本的な機能に固執したいと思います。
この簡単に削除するために、私は次のことを行います:
zehe="Logfile started :29.06.2019 23:03:17"
echo "${zehe#*:}"
これは印刷されます:
29.06.2019 23:03:17
私があなたの立場にいて、プログラミングとbashを学び始めたとき、私はこのハンドブックの多くを学びました:
問題のいくつかの例と興味深い情報が見つかります ここ 、「サブストリングの削除」を探します。
これは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"
_
別の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
コマンドの定位置パラメーターに変換します。echo
をtail -n1 /path/to/reportfile.txt
に置き換えます。