2009-03-22 3 views
0

Я пытаюсь скопировать команду из истории. Как я могу скопировать 510-ю команду? Пожалуйста, ознакомьтесь с приведенными ниже данными. Моя ставка составляет:Как скопировать команду из истории?

history | grep 510 | sed '1q;d' | awk '{print $2-$10}' | pbcopy 

но результат равен 0. Я не могу понять причину. Что не так в команде?

505 find . -perm=750 -print0 | xargs -0 chmod 750 
    506 find . --perm=750 -print0 | xargs -0 chmod 750 
    507 find . -perm=750 -print0 | xargs -0 chmod 750 
    508 find . -perm=750 -print0 | xargs -0 chmod 750 
    510 find . -perm 750 -print0 | xargs -0 chmod 750 
    512 history | grep perm 750 -print0 | pbcopy 

ответ

5

Если вы используете Баш:

echo "!510" | pbcopy 

(Смотрите также "расширение истории" в bash manual)

+0

Он работал без кавычек. Спасибо! –

+0

@UnixBasics: Не пытайтесь использовать это без кавычек, это повредит вам. – Juliano

1

Вы можете использовать Perl для печати все, кроме первого столбца (510) запрашиваемой линии:

history | perl -ane 'print "@F[1..$#F]" if($F[0]==510)' 
0

Причина заключается в том, что $2 и $10 не являются числами в скриптах AWK. Индексы полей основаны на 1, поэтому, если вы хотите 750, первый из них - $5, второй - $11.

Обратите внимание, что это отличается от линий с "-perm=750"

+0

Я думаю, что человек хочет целый ряд полей, а не вычитание. Потрясающее совпадение, хотя! – ashawley

1

Для диапазон полей в Awk, вам нужен цикл for. То, что вы делаете, это вычитание, а результат - ноль.

Обычно команда cut выполняет задачу по извлечению столбцов, но иногда Awk более подходит.

Вот что вы имели в виду.

history | grep 510 | sed 1q \ 
| awk '{for(i = 2; i <= NF; i++){ORS = (i == NF ? "\n" : " "); print $i;}}' \ 
| pbcopy 
Смежные вопросы