Riwayat pesta tanpa nomor baris

129

historyPerintah bash sangat keren. Saya mengerti mengapa ini menunjukkan nomor baris, tetapi apakah ada cara saya bisa memanggil perintah sejarah dan menekan nomor baris?

Intinya di sini adalah untuk menggunakan perintah sejarah, jadi tolong jangan balas cat ~/.bash_history

Output Saat Ini:

  529 man history
  530 ls
  531 ll
  532 clear
  533 cd ~
  534 history

Sumber grafis historis.

Output yang Diinginkan:

man history
ls
ll
clear
cd ~
history

Sumber grafis historis.

Terima kasih kepada semua orang untuk solusi hebat Anda. Paul's adalah yang paling sederhana dan akan bekerja untuk saya karena ukuran bash history saya diatur pada 2000.

Saya juga ingin membagikan artikel keren yang saya temukan pagi ini. Ini memiliki beberapa opsi bagus yang sekarang saya gunakan, seperti menjaga entri duplikat dari sejarah bash dan memastikan beberapa sesi bash tidak menimpa file riwayat: http://blog.macromates.com/2008/working-with -history-in-bash /

cwd
sumber
Bolehkah saya bertanya mengapa cat ~/.bash_historydikesampingkan?
flow2k

Jawaban:

204

Coba ini:

$ history | cut -c 8-
Paul R
sumber
Bisakah kita menyalurkan output dari historyperintah daripada membaca file?
cwd
Tampaknya bekerja! Bisakah Anda jelaskan apa yang dilakukannya? Apakah akan berfungsi jika angkanya 1 - 10.000?
cwd
29
man cut. Ini menghapus 7 karakter pertama dari setiap baris output dari historyperintah. Seharusnya hanya memiliki masalah jika jumlahnya melebihi 99.999, sesuatu yang belum pernah saya lihat (dan saya menggunakan banyak kerang ). Tetapi jika Anda khawatir tentang hal itu:history | sed 's/^ *[0-9]* *//'
Keith Thompson
1
Saya pikir solusi @Paul R adalah apa yang saya butuhkan. Awalnya saya tidak menyadari bahwa perintah histori mengisi nomor baris dengan spasi dan sekarang cutsintaks lebih masuk akal :) Terima kasih @Keith Thompson untuk solusi Anda yang akan bekerja untuk> sejarah 100k.
cwd
5
@ cwd: Jika Anda memiliki 100.000 perintah dalam riwayat, sekarang saatnya untuk mundur dari keyboard dan pulang. Jika Anda sudah di rumah, pergi ke luar. 8-)} (Ya, saya tahu sejarah dapat dipertahankan di seluruh sesi.)
Keith Thompson
22

awk bisa membantu:

history|awk '{$1="";print substr($0,2)}'

Jawaban ini bisa gagal jika Anda memiliki sejarah panjang.

Zsolt Botykai
sumber
Ha Ha, terima kasih - substrjauh lebih sederhana, saya telah menggunakan history | awk '{for (i=2;i<=NF;i++) printf("%s ", $i);print("\r")}'milik saya !!
geedoubleya
17

Saya cukup sadar bahwa pertanyaan ini untuk bash dan banyak orang lebih suka untuk tidak beralih ke zsh (isyarat turun ...)

Namun, jika Anda bersedia untuk beralih ke zsh maka zsh mendukung ini secara asli (serta opsi lain untuk pemformatan riwayat)

zsh> fc -ln 0

(Lihat /server/114988/removing-history-or-line-numbers-from-zsh-history-file )

Att Righ
sumber
7
Sebenarnya fcadalah bashbuiltin juga. Satu-satunya perbedaan adalah bahwa baris pertama adalah 1, jadi itu akanfc -ln 1
wisbucky
/ /, Punya upvote untuk fakta bahwa saya bahkan tidak tahu ada alternatif untuk Bash untuk waktu yang lama sampai seseorang membawa mereka dalam konteks seperti ini.
Nathan Basanese
11

Saya telat dalam hal ini, tetapi metode yang lebih pendek adalah menambahkan berikut ini di file ~/.bashrcatau Anda ~/.profile:

HISTTIMEFORMAT="$(echo -e '\r\e[K')"

Dari bash manpage:

       HISTTIMEFORMAT
              Jika variabel ini disetel dan bukan nol, nilainya digunakan sebagai a
              format string untuk strftime (3) untuk mencetak cap waktu yang terkait
              dengan setiap entri riwayat ditampilkan oleh riwayat bawaan. Jika
              variabel ini disetel, cap waktu ditulis ke riwayat
              file sehingga mereka dapat disimpan di seluruh sesi shell. Ini menggunakan
              karakter komentar riwayat untuk membedakan cap waktu
              garis sejarah lainnya.

Dengan menggunakan kemampuan ini, peretasan cerdas terdiri dari membuat variabel "mencetak" carriage return ( \r) dan menghapus garis (kode ANSI K) alih-alih cap waktu yang sebenarnya.

iMil
sumber
Sedikit lebih sederhana, menggunakan sintaksis yang lebih kabur:HISTTIMEFORMAT=$'\r\e[K'
wjandrea
5
Dan opsi satu baris:HISTTIMEFORMAT=$'\r\e[K' history
wjandrea
5

Atau, Anda bisa menggunakan sed:

history | sed 's/^[ ]*[0-9]\+[ ]*//'

Dengan menggunakan alias, Anda dapat menetapkan ini sebagai standar Anda (tempel di bash_profile Anda):

alias history="history | sed 's/^[ ]*[0-9]\+[ ]*//'"
Manny D
sumber
1
\+dalam ekspresi reguler dasar tidak sesuai POSIX. Gunakan \{1,\}jika Anda sedtidak mendukung \+ekstensi non-standar .
Richard Hansen
4

Meskipun dipotong dengan -copsi berfungsi untuk sebagian besar tujuan praktis, saya pikir bahwa sejarah perpipaan untuk awk akan menjadi solusi yang lebih baik. Sebagai contoh:

history | awk '{ $1=""; print }'

ATAU

history | awk '{ $1=""; print $0 }'

Kedua solusi ini melakukan hal yang sama. Keluaran sejarah diumpankan ke awk. Awk kemudian mengosongkan kolom pertama, yang sesuai dengan angka dalam output perintah sejarah. Di sini awk lebih nyaman karena Anda tidak perlu khawatir dengan jumlah karakter di bagian nomor output.

print $0sama dengan print, karena standarnya adalah untuk mencetak semua yang muncul di telepon. Mengetik print $0lebih eksplisit, tetapi yang Anda pilih terserah Anda. Perilaku print $0dan hanya printketika digunakan dengan awk lebih jelas jika Anda menggunakan awk untuk mencetak file ( catakan lebih cepat untuk mengetik daripada awk, tetapi ini untuk menggambarkan suatu hal).

[Ex] Menggunakan awk untuk menampilkan isi file dengan $ 0

$ awk '{print $0}' /tmp/hello-world.txt
Hello World!

[Ex] Menggunakan awk untuk menampilkan konten file tanpa $ 0 eksplisit

$ awk '{print}' /tmp/hello-world.txt
Hello World!

[Ex] Menggunakan awk ketika garis sejarah membentang beberapa baris

$ history
   11  clear
   12  echo "In word processing and desktop publishing, a hard return or paragraph break indicates a new paragraph, to be distinguished from the soft return at the end of a line internal to a paragraph. This distinction allows word wrap to automatically re-flow text as it is edited, without losing paragraph breaks. The software may apply vertical whitespace or indenting at paragraph breaks, depending on the selected style."

$ history | awk ' $1=""; {print}'
 clear
 echo "In word processing and desktop publishing, a hard return or paragraph break indicates a new paragraph, to be distinguished from the soft return at the end of a line internal to a paragraph. This distinction allows word wrap to automatically re-flow text as it is edited, without losing paragraph breaks. The software may apply vertical whitespace or indenting at paragraph breaks, depending on the selected style."
Suave-V
sumber
4
history -w /dev/stdout

Dari output history --help:

-w menulis riwayat saat ini ke file riwayat

Itu menulis sejarah saat ini ke file yang ditentukan - /dev/stdoutdalam hal ini.

czerny
sumber
3

historyperintah tidak memiliki opsi untuk menekan nomor baris. Anda harus menggabungkan beberapa perintah karena semua orang menyarankan:

Contoh:

history | cut -d' ' -f4- | sed 's/^ \(.*$\)/\1/g'
Pembawa cincin
sumber
3
Jika Anda tetap akan menjalankannya sed, maka potongan awal berlebihan - cukup tambahkan saja ke ekspresi.
moopet
2
$ hh -n

Anda mungkin ingin mencoba https://github.com/dvorka/hstr yang memungkinkan pemfilteran "sarankan gaya kotak" dari riwayat Bash dengan pemesanan berdasarkan metrik (opsional) yaitu jauh lebih efisien dan lebih cepat dalam arah maju dan mundur:

masukkan deskripsi gambar di sini

Itu dapat dengan mudah terikat Ctrl-rdan / atauCtrl-s

Martin Dvorak
sumber
1

Anda dapat menggunakan perintah cutuntuk menyelesaikannya:

Potong bidang dari STDIN atau file.

  • Gunting enam belas karakter pertama dari setiap baris STDIN: cut -c 1-16

  • Gunting enam belas karakter pertama dari setiap baris file yang diberikan: cut -c 1-16 file

  • Gunting semuanya mulai dari karakter ke-3 hingga akhir setiap baris: cut -c3-

  • Potong bidang kelima dari setiap baris, menggunakan titik dua sebagai pembatas bidang (pembatas default adalah tab): cut -d':' -f5

  • Potong bidang ke-2 dan ke-10 dari setiap baris, menggunakan tanda titik koma sebagai pembatas: cut -d';' -f2,10

  • Gunting bidang 3 hingga 7 dari setiap baris, menggunakan spasi sebagai pembatas: cut -d' ' -f3-7

GEOKING
sumber
0

Saya tahu saya terlambat ke pesta tetapi ini jauh lebih mudah untuk diingat:

cat ~/.bash_history
Mike Slinn
sumber
Benar, tetapi baris kedua OP: "Intinya di sini adalah menggunakan perintah sejarah, jadi tolong jangan balas cat ~ /
.bash_history