Bagaimana menghapus tanda titik dua ':' dari stempel waktu?


10

Saya baru dalam pemrograman !!

Adakah yang bisa membantu menghapus :pada posisi pertama dalam stempel waktu::29.06.2019 23:03:17

Saat ini saya mencoba melakukannya dengan menggunakan perintah awk / cut seperti yang ditunjukkan di bawah ini:

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


29.06.2019 23

Dan hasilnya bukan yang saya inginkan! Saya ingin mencetaknya sebagai 29.06.2019 23:03:17.

Jawaban:


14

Untuk memotong karakter pertama, Anda juga dapat menggunakan cut -c:

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

11

Menggunakan

cut -d: -f2-

dari pada

cut -d: -f2

untuk mendapatkan apa pun dari bidang kedua hingga akhir baris:

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

8

awkadalah alat yang keren, dan Anda bisa menyelesaikan tugas yang sangat rumit dengannya. Tapi untuk pertanyaan Anda, saya lebih suka tetap berpegang pada kemampuan dasar bash.

Untuk penghapusan subtitle yang mudah ini, saya akan melakukan hal berikut:

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

ini akan mencetak:

29.06.2019 23:03:17

Ketika saya berada di posisi Anda dan mulai belajar pemrograman dan bash, saya belajar banyak dari Buku Pegangan ini:

ABS - Panduan Script Bash Lanjutan

Beberapa contoh lagi dan informasi menarik untuk masalah Anda dapat ditemukan di sini , cari 'Substring Removal'.


3
Beri ini +1! Karena pertanyaan ini ditandai "bash", itu harus dianggap lebih memilih kemampuan hebat bash (walaupun seringkali cukup tidak jelas) untuk memanipulasi string yang jauh lebih cepat daripada memuat alat eksternal.
rexkogitans

2
@rexkogitans karena kita sudah memanggil grep atau awk untuk mem-parsing file, bash tidak akan lebih cepat. Bahkan, setiap kali Anda perlu mengurai file bash akan lambat. Semua shell lebih lambat dan bash lebih lambat dari kebanyakan. Yang mengatakan, kemampuan manipulasi string shell memang sering merupakan pendekatan terbaik, tetapi hanya jika Anda sudah memiliki input sebagai variabel.
terdon

8

Ini sedsolusinya:

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

Apa yang dilakukan perintah sed 's/^://'adalah mengganti skarakter titik dua :dari awal ^setiap baris dengan string kosong //.

Berikut adalah awksolusi rumit , tempat kami mengubah pemisah bidang menjadi ^:, yang dijelaskan di atas, dan menampilkan bidang kedua (dari setiap baris):

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

Tugas dapat diselesaikan juga dengan grep( penjelasan ), mungkin ini bisa menjadi solusi tercepat untuk sejumlah besar data:

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

Atau proses file secara langsung dengan perintah berikut, di mana batasan ^dihapus:

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

Hal di atas dapat dicapai juga oleh seddan menangkap kelompok ()->\1:

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

Di mana ekspresi ^.*<something>.*$akan cocok dengan seluruh baris, yang berisi <something>. Perintah s/old/new/akan mengganti baris ini dengan konten dari kelompok tangkapan pertama (ekspresi dalam tanda kurung bisa lebih konkret). Opsi ini -rmemungkinkan ekspresi reguler yang diperluas. Opsi -nakan menekan output normal seddan akhirnya perintah pakan mencetak yang cocok.


Saya tidak pernah tahu awkbisa memiliki multi karakter FS dengan karakter dengan makna khusus! Hal yang saya pelajari hari ini.
Floris

6

Karena Anda sudah memproses ini awk, Anda dapat melakukan semuanya secara langsung:

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

The subFormat umum perintah adalah sub(/REGEX/, REPLACEMENT, TARGET)dan akan mengganti semua pertandingan untuk ekspresi reguler REGEXdengan string REPLACEMENTdalam string masukan TARGET. Di sini, kami mengganti yang pertama :( ^berarti "awal") dari bidang ke-3 ( $3) tanpa apa-apa.

Tentu saja, jika Anda melakukannya dengan awk, Anda bisa melakukan semuanya dengan awk dan menyelesaikan semuanya dalam satu operasi:

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

Atau, dalam kasus Anda:

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

0

Solusi bash lain:

$ echo "Logfile started :29.06.2019 23:03:17" | xargs bash -c 'echo "${2#*:} $3"'
29.06.2019 23:03:17
  • Ini menggunakan pipa bukannya penugasan variabel menengah.
  • Perintah xargsmengkonversi stdin(input standar) ke parameter posisi untuk bashperintah.
  • Ganti echodengan tail -n1 /path/to/reportfile.txt.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.