Как я могу сделать команду 'истории' и не иметь номера строки, таким образом, я могу скопировать несколько команд строки?

Это распознано BIOS? Это работает с Windows Live-CD? Согласно, например, эта страница или это сообщение в блоге на немецком языке это должно просто работать с Ubuntu 10.4.

5
14.08.2012, 01:11
5 ответов

Используя awk:

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

2
27.01.2020, 20:33
  • 1
    Это должно иметь пространство между каждым, чтобы работать правильно –  Michael Durrant 13.08.2012, 16:31
  • 2
    , я добавил пространство. Теперь я замечаю, что, не слишком удивительный, это только работает на первые 3 объекта, разделенные пространством, остальные проигнорированы. –  Michael Durrant 13.08.2012, 16:37
  • 3
    Это только возвращает 3 части каждой командной строки, я не думаю именно это OP, относительно которого попросили. –  Thor 13.08.2012, 16:40
  • 4
    @Tim history | awk '{$1="";print}' будет работать намного лучший ;) –  rush 13.08.2012, 16:52
  • 5
    я на самом деле обновил это"awk"ответ с этим, поскольку это - намного лучшее решение. Также я могу затем инвертировать свой downvote. Я не люблю вниз-голоса и использую их экономно. –  Michael Durrant 13.08.2012, 17:01

Обратите внимание, что вывод истории может зависеть от окружения. На моей машине это смотрит как:

 $ history | tail -1
 2993  2012-08-13 17:42:17 echo "test"

и ни один из Ваших ответов не будет работать рядом.

Полезная опция fc (обычно это встроено), который работает совершенно независимый от Ваших локальных настроек.

fc имеет -n опция, которая подавляет числа в выводе. Таким образом, Ваша команда была бы похожа:

fc -l -n

это производит только несколько последних команд.

Производить целую историю в этом использовании стиля:

fc -l -n 1  

Производить без пробелов при начинании Вас может использовать sed для удаления их:

fc -l -n 1 | sed 's/^\s*//'
6
27.01.2020, 20:33
  • 1
    Работы, хотя дает много пробелов в начале строки. До сих пор я предпочитаю ответ Тора.Спасибо. –  Michael Durrant 13.08.2012, 16:52
  • 2
    @MichaelDurrant можно удалить все конечные пробелы с sed 's/^\s*//'. Я только что добавил опцию с ним к моему ответу. –  rush 13.08.2012, 16:55
  • 3
    Brilliant и ksh-совместимый (для администраторов AIX). –  kubanczyk 08.04.2016, 22:07

Альтернативное решение состоит в том, чтобы использовать метод выбора блока терминала, если это имеет его в наличии. Обычно Вы просто держите Ctrl прежде, чем выбрать с мышью. Это включит режим выбора блока во многих современных терминалах (определенно многочисленные терминалы на основе libvte).

Затем, просто перетащите и выпустите так свои покрытия блока выбора все строки (до полной ширины самой долгой команды), Вы хотите скопировать. Затем Вы просто вставляете его, и новые строки будут сохранены.

Это - простой прием, который я использую много раз в день при выполнении быстрой копии/вставок, для предотвращения вещей как снабженные префиксом номера строки, метки времени в файлах журнала, и т.д.

Обратите внимание, что это не будет работать, если одна из скопированных команд охватит больше чем одну строку!

1
27.01.2020, 20:33

В bash:

history | tr -s ' ' | cut -d' ' -f3-

В zsh и ksh:

history -n

В tcsh:

history -h

Править

Также см. ответ порыва об использовании fc.

2
27.01.2020, 20:33
  • 1
    Да это больше похоже на это –  Michael Durrant 13.08.2012, 16:40
  • 2
    Да и с псевдонимом nhistory ='history | TR-s ''| сократил-d' '-f3-' в моем ~/.bash_aliases файл, у меня теперь есть nhistory для "бесчисленной" истории в моих кончиках пальцев. Я испытал желание использовать nnhistory, но я также иду для меньшего количества символов, когда я могу для псевдонимов quicky. –  Michael Durrant 13.08.2012, 16:43
  • 3
    history | tr -s ' ' | cut -d' ' -f5- в моем случае для вырезания префиксов –  Fedir RYKHTIK 23.10.2014, 17:49
  • 4
    @Fedir: Интересный, под которым оболочка - это? –  Thor 24.10.2014, 01:02
  • 5
    @Thor bash с export HISTTIMEFORMAT="[%F %T] " –  Fedir RYKHTIK 24.10.2014, 13:57

tl; dr: Используйте history -p \! - {4..1}


Если единственная причина, по которой вы хотите их скопировать, - это то, что вы можете запустить их снова, вы можете просто использовать раскрытие истории. (Запустите LESS = '+ / ^ history extension' man bash , чтобы увидеть справочную страницу для этого.)

Например, скажем, я хочу повторно запустить последние четыре команды. Я могу просто ввести:

!-4; !-3; !-2; !!

Если я не совсем уверен, что это были последние четыре команды, и я хочу проверить, что это были за команды перед их запуском, я могу использовать модификатор p , чтобы напечатать и добавить его в мою историю, не запуская его:

!-4; !-3; !-2; !!:p

(Достаточно поместить его в любое одно расширение истории; при этом ничего не запустится.)

Теперь, если оно меня устраивает, я просто нажимаю " стрелку вверх и нажмите «ввод».


Если я хочу сохранить команду в файл для дальнейшего использования, я использую параметр -p для команды history . Сначала я обычно получаю номер истории последней команды, например, запустив history | хвост . Допустим, это выглядит так:

$ history | tail
 1136  cd /tmp
 1137  ls 
 1138  cd -
 1139  pwd
 1140  cp somefile ~-/
 1141  ping somesite.com
 1142  printf '%*.*s\n' 0 "$(tput cols)" "$(printf '%0.1s' -{1..$(tput cols)})"
 1143  for ((i=1;i<=3;i++)); do awk -F: -vi="$i" '{if (NR != 1) {printf ":"} {printf "%s",$i}} END {printf "\n"}' input; done | column -t -s:
 1144  cd ~/documents
 1145  history | tail

Если я хочу сохранить длинную команду цикла for (строка 1143) для дальнейшего использования, я могу легко сделать это, используя history -p как следует:

$ history -p \!1143 >> my_list_of_one_liners.sh

Обратите внимание, что history -p сам по себе не отображается в списке истории.


Также обратите внимание, что history -p может принимать несколько аргументов и будет раскрывать каждый в отдельной строке. Так что на самом деле это лучший ответ на ваш вопрос, который я сейчас понял.

Запустите history -p \! - {4..1} , и вы увидите, что последние четыре команды, которые вы выполнили, напечатаны на вашем терминале без предшествующих номеров, что идеально подходит для копирования. 4 можно заменить любым числом, которое вам нравится.

2
27.01.2020, 20:33

Теги

Похожие вопросы