Історія башів без номерів рядків


129

Команда bash historyдуже класна. Я розумію, чому він показує номери рядків, але чи є спосіб я викликати команду "Історія" та придушувати номери рядків?

Суть у тому, щоб використовувати команду "історія", тому, будь ласка, не відповідайте cat ~/.bash_history

Поточний вихід:

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

Історичне графічне джерело.

Бажаний вихід:

man history
ls
ll
clear
cd ~
history

Історичне графічне джерело.

Дякуємо всім за ваші чудові рішення. Paul's є найпростішим і буде працювати для мене тому, що мій розмір історії баш встановлений у 2000 році.

Я також хотів поділитися класною статтею, яку я знайшов сьогодні вранці. У мене є кілька хороших варіантів, які я зараз використовую, як збереження повторних записів із історії башів і переконайтеся, що кілька сеансів bash не перезаписують файл історії: http://blog.macromates.com/2008/working-with -історія-в-баші /


Чи можу я запитати, чому cat ~/.bash_historyце виключено?
flow2k

Відповіді:


204

Спробуйте це:

$ history | cut -c 8-

Чи можемо ми historyподати висновок з команди, а не читати файл?
cwd

Здається, працює! Чи можете ви пояснити, що це робить? Чи спрацює, якщо цифри становлять 1 - 10000?
cwd

29
man cut. Це видалення перших 7 символів кожного рядка виводу historyкоманди. Він повинен мати тільки проблеми , якщо їх число перевищує 99999, що - то я ніколи не бачив (і я використовую снаряди багато ). Але якщо вас це турбує:history | sed 's/^ *[0-9]* *//'
Кіт Томпсон,

1
Я думаю, що рішення @Paul R - це те, що мені потрібно. Спочатку я не розумів, що команда "історія" cutпробиває номери рядків пробілами, і тепер синтаксис має більше сенсу :) Дякую @Keith Томпсон за ваше рішення, яке буде працювати на> 100k історії.
cwd

5
@cwd: Якщо у вас в історії 100 000 команд, настав час відійти від клавіатури та йти додому. Якщо ви вже вдома, виходьте на вулицю. 8-)} (Так, я знаю, що історію можна зберігати протягом сеансів.)
Кіт Томпсон,

22

awk може допомогти:

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

Ця відповідь може бути невдалою, якщо у вас довга історія.


Ха-ха, дякую - substrнабагато простіше, я використовував history | awk '{for (i=2;i<=NF;i++) printf("%s ", $i);print("\r")}'для мого !!
Гедюблея

17

Я цілком усвідомлюю, що це питання стосується bash, і багато людей вважають за краще не переходити на zsh (cue downvotes ...)

Однак якщо ви були готові перейти на zsh, тоді zsh підтримує це спочатку (як і інші варіанти форматування історії)

zsh> fc -ln 0

(Побачити Https://serverfault.com/questions/114988/removing-history-or-line-numbers-from-zsh-history-file )


7
Насправді також fcє bashвбудованим. Єдина відмінність полягає в тому, що перший рядок є 1, так би і булоfc -ln 1
wisbucky

// Майте нагоду за те, що я навіть не знав, що існують альтернативи Башу протягом тривалого часу, поки хтось не виховує їх у такому контексті.
Натан Басанес

11

Я запізнююсь на цей, але більш коротким методом було б додати наступне у свій файл ~/.bashrcчи ~/.profileфайл:

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

З баш manpage :

       ХІСТТИМЕФОРМАТ
              Якщо ця змінна встановлена ​​і не є нульовою, її значення використовується як a
              форматний рядок для строку (3) для друку пов'язаної позначки часу
              з кожним записом історії відображається вбудованою історією. Якщо
              ця змінна встановлюється, часові позначки записуються в історію
              файл, щоб вони могли зберігатися протягом сеансів оболонки. Для цього використовується
              характер коментаря до історії, щоб відрізнити часові позначки від
              інші рядки історії.

Використовуючи цю можливість, розумний злом полягає в тому, щоб зробити змінну "надрукувати" повернення каретки ( \r) та очистити рядок (код ANSI K) замість фактичної часової позначки.


Трохи простіше, використовуючи більш незрозумілий синтаксис:HISTTIMEFORMAT=$'\r\e[K'
wjandrea

5
І однолінійний варіант:HISTTIMEFORMAT=$'\r\e[K' history
wjandrea

5

Крім того, ви можете використовувати sed:

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

Використовуючи псевдонім, ви можете встановити це як свій стандарт (дотримуйтесь його у вашому bash_profile):

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

1
\+в основному регулярний вираз не відповідає POSIX. Використовуйте, \{1,\}якщо ваш sedне підтримує нестандартне \+розширення.
Річард Хансен

4

Хоча вирізання з цим -cваріантом працює в більшості практичних цілей, я вважаю, що краща розробка історії історії буде кращим рішенням. Наприклад:

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

АБО

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

Обидва ці рішення роблять те саме. Вихід історії подається на пробудження. Тоді Awk видає перший стовпець, який відповідає числам у виведенні команди команда історія. Тут awk зручніше, тому що вам не доведеться піклуватися про кількість символів у числовій частині виводу.

print $0еквівалентно print, оскільки за замовчуванням друкується все, що з’являється у рядку. Введення тексту print $0більш чітке, але ви обираєте, який саме ви обираєте. Поведінка print $0та просто printпри використанні awk видно, якщо ви використовували awk для друку файлу (cat було б швидше набрати замість awk, але це для ілюстрації точки).

[Ex] Використання awk для відображення вмісту файлу з 0 доларів

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

[Ex] Використання awk для відображення вмісту файлу без явного $ 0

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

[Ex] Використання awk, коли рядок історії охоплює кілька рядків

$ 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

З виходу history --help:

-w записувати поточну історію у файл історії

Він записує поточну історію у вказаний файл - /dev/stdoutу цьому випадку.


3

historyкоманда не має можливості придушити номери рядків. Вам доведеться поєднувати кілька команд, як усі пропонують:

Приклад:

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

3
Якщо ви все sedодно хочете запустити його , тоді початковий розріз є зайвим - просто додайте його до виразу.
moopet

2
$ hh -n

Ви можете спробувати https://github.com/dvorka/hstr, що дозволяє фільтрувати історію башів із “замовленням стилю поля” із замовленням на основі (за бажанням) показників на основі замовлення, тобто це набагато ефективніше та швидше в прямому та зворотному напрямку:

введіть тут опис зображення

Він може бути легко пов'язаний з Ctrl-rта / абоCtrl-s


1

Ви можете використовувати команду cutдля її вирішення:

Виріжте поля зі STDIN або файлів.

  • Виріжте перші шістнадцять символів кожного рядка STDIN: cut -c 1-16

  • Виріжте перші шістнадцять символів з кожного рядка даних файлів: cut -c 1-16 file

  • Виріжте все від 3-го символу до кінця кожного рядка: cut -c3-

  • Виріжте п’яте поле кожного рядка, використовуючи двокрапку як роздільник поля (роздільник за замовчуванням - це вкладка): cut -d':' -f5

  • Виріжте 2-е та 10-е поля кожного рядка, використовуючи крапку з комою як роздільник: cut -d';' -f2,10

  • Виріжте поля з 3 по 7 кожного рядка, використовуючи пробіл як роздільник: cut -d' ' -f3-7


0

Я знаю, що я спізнююсь на вечірку, але це просто набагато простіше запам'ятати:

cat ~/.bash_history

Щоправда, але другий рядок ОП: "Сенс у тому, щоб використовувати команду" історія ", тому, будь ласка, не відповідайте cat ~ / .bash_history"
Cireo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.