Lịch sử Bash không có số dòng


129

Lệnh bash historyrất tuyệt. Tôi hiểu tại sao nó hiển thị số dòng, nhưng có cách nào tôi có thể gọi lệnh lịch sử và triệt tiêu số dòng không?

Vấn đề ở đây là sử dụng lệnh lịch sử, vì vậy vui lòng không trả lời cat ~/.bash_history

Sản lượng hiện tại:

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

Nguồn đồ họa lịch sử.

Sản phẩm chất lượng:

man history
ls
ll
clear
cd ~
history

Nguồn đồ họa lịch sử.

Cảm ơn tất cả mọi người cho các giải pháp tuyệt vời của bạn. Paul's là đơn giản nhất và sẽ làm việc cho tôi vì kích thước lịch sử bash của tôi được đặt ở mức 2000.

Tôi cũng muốn chia sẻ một bài viết mát mẻ tôi tìm thấy sáng nay. Nó có một vài tùy chọn tốt mà tôi hiện đang sử dụng, như giữ các mục trùng lặp khỏi lịch sử bash và đảm bảo nhiều phiên bash không ghi đè lên tệp lịch sử: http://blog.macromates.com/2008/usiness-with -history-in-bash /


Tôi có thể hỏi tại sao cat ~/.bash_historybị loại trừ?
Flow2k

Câu trả lời:


204

Thử cái này:

$ history | cut -c 8-

Chúng ta có thể dẫn đầu ra từ historylệnh thay vì đọc tệp không?
cwd

Có vẻ để làm việc! Bạn có thể giải thích những gì nó đang làm? Nó sẽ hoạt động nếu các số là 1 - 10.000?
cwd

29
man cut. Nó xóa 7 ký tự đầu tiên của mỗi dòng đầu ra của historylệnh. Nó chỉ có vấn đề nếu số lượng vượt quá 99.999, một thứ tôi chưa từng thấy (và tôi sử dụng đạn rất nhiều ). Nhưng nếu bạn lo lắng về điều đó:history | sed 's/^ *[0-9]* *//'
Keith Thompson

1
Tôi nghĩ giải pháp của @Paul R là thứ tôi cần. Lúc đầu tôi không nhận ra rằng lệnh lịch sử đã đệm các số dòng bằng dấu cách và bây giờ cutcú pháp có ý nghĩa hơn :) Cảm ơn @Keith Thompson vì giải pháp của bạn sẽ hoạt động cho lịch sử> 100 nghìn.
cwd

5
@cwd: Nếu bạn có 100.000 lệnh trong lịch sử của mình, đã đến lúc lùi ra khỏi bàn phím và về nhà. Nếu bạn đã về nhà, hãy ra ngoài. 8-)} (Vâng, tôi biết lịch sử có thể được giữ lại qua các phiên.)
Keith Thompson

22

awk có thể giúp đỡ:

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

Câu trả lời này có thể thất bại nếu bạn có một lịch sử lâu dài.


Ha Ha, cảm ơn - substrđơn giản hơn nhiều, tôi đã sử dụng history | awk '{for (i=2;i<=NF;i++) printf("%s ", $i);print("\r")}'cho tôi !!
geedoubleya

17

Tôi khá biết rằng câu hỏi này là dành cho bash và nhiều người không muốn chuyển sang zsh (cue downvotes ...)

Tuy nhiên, nếu bạn sẵn sàng chuyển sang zsh thì zsh hỗ trợ nguyên bản này (cũng như các tùy chọn khác để định dạng lịch sử)

zsh> fc -ln 0

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


7
Trên thực tế fclà một bashnội dung tốt. Sự khác biệt duy nhất là dòng đầu tiên là 1, vì vậy nó sẽ làfc -ln 1
wvducky

//, Có một sự ủng hộ cho thực tế là tôi thậm chí không biết có những lựa chọn thay thế cho Bash trong thời gian dài nhất cho đến khi ai đó đưa chúng lên trong bối cảnh như thế này.
Nathan Basan

11

Tôi đã muộn với cách này, nhưng phương pháp ngắn hơn sẽ là thêm các mục sau vào tệp ~/.bashrchoặc ~/.profiletệp của bạn :

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

Từ bash manpage:

       HISTTIMEFORMAT
              Nếu biến này được đặt và không null, giá trị của nó được sử dụng như một
              chuỗi định dạng cho strftime (3) để in dấu thời gian liên quan
              với mỗi mục lịch sử được hiển thị bởi nội dung lịch sử. Nếu
              biến này được đặt, tem thời gian được ghi vào lịch sử
              để chúng có thể được bảo quản trong các phiên shell. Cái này dùng
              ký tự nhận xét lịch sử để phân biệt dấu thời gian với
              dòng lịch sử khác.

Sử dụng khả năng này, một hack thông minh bao gồm việc biến "in" trở lại vận chuyển ( \r) và xóa dòng (mã ANSI K) thay vì dấu thời gian thực tế.


HISTTIMEFORMAT=$'\r\e[K'
Đơn

5
Và tùy chọn một dòng:HISTTIMEFORMAT=$'\r\e[K' history
wjandrea

5

Ngoài ra, bạn có thể sử dụng sed:

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

Sử dụng bí danh, bạn có thể đặt tiêu chuẩn này làm tiêu chuẩn của mình (dán nó vào bash_profile của bạn):

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

1
\+trong một biểu thức chính quy cơ bản không phù hợp POSIX. Sử dụng \{1,\}nếu bạn sedkhông hỗ trợ \+tiện ích mở rộng không chuẩn .
Richard Hansen

4

Mặc dù cắt giảm với -ctùy chọn hoạt động cho hầu hết các mục đích thực tế, tôi nghĩ rằng lịch sử đường ống đến awk sẽ là một giải pháp tốt hơn. Ví dụ:

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

HOẶC LÀ

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

Cả hai giải pháp này đều làm điều tương tự. Đầu ra của lịch sử đang được cung cấp cho awk. Awk sau đó làm trống cột đầu tiên, tương ứng với các số trong đầu ra của lệnh lịch sử. Ở đây awk thuận tiện hơn vì bạn không phải lo lắng về số lượng ký tự trong phần số của đầu ra.

print $0tương đương với print, vì mặc định là in mọi thứ xuất hiện trên dòng. Gõ print $0thì rõ ràng hơn, nhưng cái nào bạn chọn là tùy thuộc vào bạn. Hành vi print $0và đơn giản printkhi được sử dụng với awk sẽ rõ ràng hơn nếu bạn sử dụng awk để in một tệp ( catsẽ nhanh hơn để nhập thay vì awk, nhưng điều này là để minh họa một điểm).

[Ví dụ] Sử dụng awk để hiển thị nội dung của tệp có $ 0

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

[Ví dụ] Sử dụng awk để hiển thị nội dung của tệp mà không rõ ràng $ 0

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

[Ví dụ] Sử dụng awk khi dòng lịch sử kéo dài nhiều dòng

$ 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

Từ đầu ra của history --help:

-w viết lịch sử hiện tại vào tập tin lịch sử

Nó ghi lịch sử hiện tại vào tập tin được chỉ định - /dev/stdouttrong trường hợp này.


3

historylệnh không có tùy chọn để chặn số dòng. Bạn sẽ phải kết hợp nhiều lệnh như mọi người đang đề xuất:

Thí dụ :

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

3
Nếu bạn vẫn sẽ chạy nó qua sed, thì phần cắt ban đầu là dư thừa - thay vào đó chỉ cần thêm nó vào biểu thức.
moopet

2
$ hh -n

Bạn có thể muốn thử https://github.com/dvorka/hstr cho phép lọc "kiểu hộp gợi ý" của lịch sử Bash với thứ tự dựa trên số liệu (tùy chọn), tức là hiệu quả hơn và nhanh hơn theo cả hai chiều tiến và lùi:

nhập mô tả hình ảnh ở đây

Nó có thể dễ dàng bị ràng buộc Ctrl-rvà / hoặcCtrl-s


1

Bạn có thể sử dụng lệnh cut để giải quyết nó:

Cắt các trường từ STDIN hoặc tệp.

  • Cắt mười sáu ký tự đầu tiên của mỗi dòng STDIN: cut -c 1-16

  • Cắt mười sáu ký tự đầu tiên của mỗi dòng của các tệp đã cho: cut -c 1-16 file

  • Cắt mọi thứ từ ký tự thứ 3 đến cuối mỗi dòng: cut -c3-

  • Cắt trường thứ năm của mỗi dòng, sử dụng dấu hai chấm làm dấu phân cách trường (dấu phân cách mặc định là tab): cut -d':' -f5

  • Cắt các trường thứ 2 và 10 của mỗi dòng, sử dụng dấu chấm phẩy làm dấu phân cách: cut -d';' -f2,10

  • Cắt các trường từ 3 đến 7 của mỗi dòng, sử dụng khoảng trắng làm dấu phân cách: cut -d' ' -f3-7


0

Tôi biết tôi đến trễ bữa tiệc nhưng điều này dễ nhớ hơn nhiều:

cat ~/.bash_history

Đúng, nhưng dòng thứ hai của OP: "Vấn đề ở đây là sử dụng lệnh lịch sử, vì vậy vui lòng không trả lời mèo ~ / .bash_history"
Cireo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.