Satır numaraları olmadan Bash geçmişi


129

Bash history komutu çok güzel. Neden satır numaralarını gösterdiğini anlıyorum, ancak geçmiş komutunu çağırıp satır numaralarını bastırmanın bir yolu var mı?

Buradaki nokta geçmiş komutunu kullanmaktır, bu yüzden lütfen cevap vermeyin cat ~/.bash_history

Akım Çıkışı:

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

Tarihsel grafik kaynağı.

Istenilen çıktı:

man history
ls
ll
clear
cd ~
history

Tarihsel grafik kaynağı.

Harika çözümleriniz için herkese teşekkürler. Paul's en basit olanıdır ve benim için çalışacaktır çünkü bash geçmiş boyutum 2000 olarak belirlenmiştir.

Ayrıca bu sabah bulduğum harika bir makaleyi paylaşmak istedim. Yinelenen girişleri bash geçmişinin dışında tutmak ve birden fazla bash oturumunun geçmiş dosyasının üzerine yazmamasını sağlamak gibi şu anda kullandığım birkaç iyi seçenek var: http://blog.macromates.com/2008/working-with -history-içinde-bash /


Neden cat ~/.bash_historyreddedildiğini sorabilir miyim ?
flow2k

Yanıtlar:


204

Bunu dene:

$ history | cut -c 8-

historyDosyayı okumak yerine komuttan çıktıyı yönlendirebilir miyiz ?
45'te cwd

Çalışıyor gibi görünüyor! Ne yaptığını açıklayabilir misin? Sayılar 1 - 10.000 arasında olursa işe yarar mı?
cwd

29
man cut. historyKomutun her çıktı satırının ilk 7 karakterini siliyor. Yalnızca sayı 99.999'u aşarsa sorun yaşar, bu hiç görmediğim bir şey (ve mermileri çok kullanıyorum ). Ama bununla ilgili endişeleriniz varsa:history | sed 's/^ *[0-9]* *//'
Keith Thompson

1
Sanırım @Paul R'nin çözümü ihtiyacım olan şey. İlk başta geçmiş komutunun satır numaralarını boşluklarla cutdoldurduğunu fark etmemiştim ve şimdi sözdizimi daha mantıklı :) @ Keith Thompson'a> 100k geçmişler için işe yarayacak çözümünüz için teşekkürler.
cwd

5
@cwd: Geçmişinizde 100.000 komutunuz varsa, klavyeden uzaklaşıp eve gitme zamanı. Zaten evdeysen, dışarı çık. 8-)} (Evet, geçmişin oturumlar boyunca saklanabileceğini biliyorum.)
Keith Thompson

22

awk yardım edebilir:

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

Uzun bir geçmişiniz varsa bu cevap başarısız olabilir.


Ha Ha, teşekkürler - substrçok daha basit, benim için kullanıyorum history | awk '{for (i=2;i<=NF;i++) printf("%s ", $i);print("\r")}'!!
geedoubleya

17

Bu sorunun bash için olduğunun oldukça farkındayım ve birçok kişi zsh'a geçmemeyi tercih eder (cue downvotes ...)

Bununla birlikte, zsh'a geçmeye istekliyseniz, zsh bunu yerel olarak destekler (ve ayrıca geçmiş biçimlendirme için diğer seçenekler)

zsh> fc -ln 0

(Bkz. Https://serverfault.com/questions/114988/removing-history-or-line-numbers-from-zsh-history-file )


7
Aslında fcbir bashyerleşiktir. Tek fark, ilk satırın 1öyle olması kifc -ln 1
akıllıca

//, Birisi onları böyle bir bağlamda gündeme getirene kadar en uzun süre Bash'in alternatifleri olduğunu bile bilmediğim gerçeğine bir olumlu oy verin.
Nathan Basanese

11

Bunda geç kaldım, ancak daha kısa yöntem aşağıdakileri dosyanıza ~/.bashrcveya ~/.profiledosyanıza eklemek olacaktır :

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

Bash'den manpage:

       HISTTIMEFORMAT
              Bu değişken ayarlanmışsa ve boş değilse, değeri bir
              ilişkili zaman damgasını yazdırmak için strftime (3) biçim dizesi
              geçmiş yerleşik tarafından görüntülenen her bir geçmiş girişi ile. Eğer
              bu değişken ayarlanır, tarihe zaman damgaları yazılır
              dosya, böylece kabuk oturumları boyunca korunabilirler. Bu kullanır
              zaman damgalarını birbirinden ayırmak için geçmiş yorum karakteri
              diğer tarih satırları.

Bu özelliği kullanarak, akıllı bir hack, gerçek bir zaman damgası yerine değişkeni bir satır başı ( \r) "yazdırmak" ve satırı temizlemek (ANSI kodu K) yapmaktan oluşur.


Daha belirsiz sözdizimi kullanarak biraz daha basit:HISTTIMEFORMAT=$'\r\e[K'
wjandrea

5
Ve tek satırlık bir seçenek:HISTTIMEFORMAT=$'\r\e[K' history
wjandrea

5

Alternatif olarak sed'i de kullanabilirsiniz:

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

Takma ad kullanarak, bunu standartınız olarak ayarlayabilirsiniz (bash_profile dosyanıza yapıştırın):

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

1
\+temel bir düzenli ifadede POSIX uyumlu değildir. Kullanım \{1,\}eğer senin sedstandart dışı desteklemez \+uzantısı.
Richard Hansen

4

-cSeçenek ile kesmek çoğu pratik amaç için işe yarasa da, bence awk için boru geçmişi daha iyi bir çözüm olacaktır. Örneğin:

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

VEYA

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

Bu çözümlerin ikisi de aynı şeyi yapıyor. Tarihin çıktısı awk'a besleniyor. Awk daha sonra geçmiş komutunun çıktısındaki sayılara karşılık gelen ilk sütunu kapatır. Burada awk daha kullanışlıdır çünkü çıktının sayı kısmındaki karakterlerin sayısı ile ilgilenmenize gerek yoktur.

print $0printvarsayılan, satırda görünen her şeyi yazdırmak olduğu için eşdeğerdir . Yazmak print $0daha açık, ancak hangisini seçeceğiniz size kalmış. Bir dosyayı yazdırmak için awk kullandıysanız print $0ve basitçe printawk ile kullanıldığında davranışı daha belirgindir cat(awk yerine yazmak daha hızlı olur, ancak bu bir noktayı göstermek içindir).

[Örn] $ 0 ile bir dosyanın içeriğini görüntülemek için awk kullanma

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

[Örn] Bir dosyanın içeriğini $ 0 belirtmeden görüntülemek için awk kullanma

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

[Örn] Geçmiş satırı birden çok satıra yayıldığında awk kullanma

$ 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."

4
history -w /dev/stdout

Çıktısından history --help:

-w mevcut geçmişi geçmiş dosyasına yazar

Geçerli geçmişi belirtilen dosyaya yazar - /dev/stdoutbu durumda.


3

historykomutunun satır numaralarını gizleme seçeneği yoktur. Herkesin önerdiği gibi birden fazla komutu birleştirmeniz gerekecek:

Misal :

history | cut -d' ' -f4- | sed 's/^ \(.*$\)/\1/g'

3
Eğer sedyine de geçecekseniz, ilk kesim gereksizdir - bunun yerine ifadeye eklemeniz yeterlidir.
moopet

2
$ hh -n

(İsteğe bağlı) metrik tabanlı sıralama ile Bash geçmişinin "kutu stili öner" filtrelemesine izin veren https://github.com/dvorka/hstr adresini denemek isteyebilirsiniz, yani hem ileri hem de geri yönde çok daha verimli ve daha hızlıdır:

görüntü açıklamasını buraya girin

Kolayca bağlanabilir Ctrl-rve / veyaCtrl-s


1

Çözmek için şu komutu kullanabilirsiniz cut:

STDIN veya dosyalardan alanları kesin.

  • Her STDIN satırının ilk on altı karakterini kesin: cut -c 1-16

  • Verilen dosyaların her satırının ilk on altı karakterini kesin: cut -c 1-16 file

  • 3. karakterden her satırın sonuna kadar her şeyi kesin: cut -c3-

  • Alan sınırlayıcı olarak iki nokta üst üste kullanarak her satırın beşinci alanını kesin (varsayılan ayırıcı sekmedir): cut -d':' -f5

  • Sınırlayıcı olarak noktalı virgül kullanarak her satırın 2. ve 10. alanlarını kesin: cut -d';' -f2,10

  • Sınırlayıcı olarak bir boşluk kullanarak her satırın 3 ile 7 arasındaki alanları kesin: cut -d' ' -f3-7


0

Partiye geç kaldığımı biliyorum ama bunu hatırlaması çok daha kolay:

cat ~/.bash_history

Doğru, ancak OP'nin ikinci satırı: "Buradaki
amaç
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.