22 ноября 2024 Bash bash hotkeys history comman edit comman


Вчера получил комментарий, о том, что в Баше есть Ctrl+l для быстрой очистки буфера и я понял, что пользуюсь только хоткеями навигации по строке и поиска. Так вот они эти быстрые клавиши

 

bash hotkeys

 

Команды для перемещения по командной строке

Команда Описание
Ctrl + a Перейти в НАЧАЛО строки команд.
Ctrl + e Перейти в КОНЕЦ строки команд.
Ctrl + b Переместить курсор на один символ назад.
Ctrl + f Переместить курсор на один символ вперед.
Alt + f Переместить курсор ВПЕРЕД на одно слово.
Alt + b Переместить курсор НАЗАД на одно слово.
Ctrl + xx Переключение между началом строки и текущей позицией курсора.
Ctrl + ] + x Где x — любой символ, переместить курсор к следующему вхождению x.
Alt + Ctrl + ] + x Где x — любой символ, переместить курсор к предыдущему вхождению x.

 

Редактирование и контроль командной строки

Команда Описание
Ctrl + d Удалить символ под курсором.
Ctrl + h Удалить символ перед курсором.
Ctrl + u Удалить все до курсора (вырезать).
Ctrl + k Удалить все после курсора (вырезать).
Ctrl + w Удалить слово перед курсором.
Alt + d Удалить слово от курсора.
Ctrl + y Вставить вырезанный текст.
Ctrl + i Автодополнение команды, как клавиша Tab.
Ctrl + l Очистить экран (аналог команды clear).
Ctrl + c Прервать выполняющийся процесс.
Ctrl + d Выйти из оболочки (если строка пуста).
Ctrl + z Перевести текущий процесс в фоновый режим.
Ctrl + _ Отменить последнее действие.
Ctrl + x Ctrl + u Отменить последнее изменение (аналог Ctrl + _).
Ctrl + t Поменять местами два символа перед курсором.
Esc + t Поменять местами два слова перед курсором.
Alt + t Поменять местами текущее и предыдущее слово.
Alt + [Backspace] Удалить ПРЕДЫДУЩЕЕ слово.
Alt + ? Показать список файлов/папок в текущем пути.
**Alt + *** Вывести все файлы/папки текущего пути как параметры.
Alt + . Вывести ПОСЛЕДНИЙ АРГУМЕНТ предыдущей команды.
Alt + c Сделать первую букву слова заглавной.
Alt + u Сделать все буквы слова заглавными.
Alt + l Сделать все буквы слова строчными.
~[Tab][Tab] Показать всех пользователей.
$[Tab][Tab] Показать все системные переменные.
@[Tab][Tab] Показать все записи из /etc/hosts.
[Tab] Автодополнение.
cd - Перейти в ПРЕДЫДУЩУЮ рабочую директорию.

 

Работа с историей баша

Команда Описание
Ctrl + r Искать команду в истории (обратный поиск).
Ctrl + s Искать команду в истории (прямой поиск).
Ctrl + p Предыдущая команда (аналог стрелки вверх).
Ctrl + n Следующая команда (аналог стрелки вниз).
Ctrl + o Выполнить команду, найденную через Ctrl + r.
Ctrl + g Выйти из режима поиска в истории.
!! Выполнить ПРЕДЫДУЩУЮ команду (например, sudo !!).
!vi Выполнить ПРЕДЫДУЩУЮ команду, начинающуюся с vi.
!vi:p Вывести команду из истории, начинающуюся с vi.
!n Выполнить команду под номером n в истории.
!$ Последний аргумент предыдущей команды.
!^ Первый аргумент предыдущей команды.
^abc^xyz Заменить первое вхождение abc на xyz в последней команде и выполнить её.
Alt + < Перейти к первой строке в истории.
Alt + > Перейти к последней строке в истории.
   

Завершение задач

Список задач можно вывести с помощью команды jobs. Для завершения задачи используйте:

kill %n

Где n — номер задачи. Например:

kill %1

взято от сюда


15 октября 2023 Bash curl awk sort uniq egrep white read


Если необходимо проверить большое количество ссылок на сайте то можно воспользоваться вот таким bash скрипт

site=http://127.0.0.1:8080

curl $site 2> /dev/null | egrep -o 'href="[^"]+"' | awk -F\" '{print $2}' | grep /catalog/ | sort | uniq | while read u; do 
curl  $site$u -o /dev/null -w "%{http_code} $u\n" -s 
done >> check-menu.txt 

Данный скрипт

  • скачивает главную страницу сайта: curl $site
  • затем  выбирает все ссылки href: egrep -o 'href="[^"]+"'
  • выбирает содержимое аттрибута href: egrep -o 'href="[^"]+"'
  • отбирает ссылки содержащие /catalog/: grep /catalog/
  • сортирует и отбирает только уникальные ссылки: sort| uniq
  • в цикле запрашивает кажду ссылку и сохраняет статус ссылки в файл check-menu.txt ;

13 октября 2023 Bash awk while read


Имеет большое количество файлов которые могут повторяться по содержимому и стоит задача оставить только уникальные файлы по содержимому. Для определения уникальности будем использовать контрольную сумму md5, а для автоматизации bash скрипт

#!/bin/bash

echo Чистка от дублей

x="" 

ls /tmp/base_1s-202* |sort  | while read f; do  
    _x=$(md5sum $f|awk '{print $1}')
    if [ $_x == "$x" ]; then 
        echo удаление $f  $_x
        rm $f 
    else 
        x=$_x
        echo сохранение $_x $f
    fi
done

 


11 октября 2023 13 октября 2023 Bash for read while git ls-files


Обычно я использую для обработки больлих списков следующую конструкцию
 

for x in $(git ls-files); do
du -sm "$x"
done

здесть создаётся локальная переменная в которой размещается результат операции find

Более оптимальная конструкция без использования локальной переменной через цикл while и read

git ls-files | while read x; 
do du -sm "$x"; 
done

 


05 октября 2023 13 октября 2023 Bash array shuf random


На самом деле всё просто и выглядит вот так

echo {0..20} 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

shuf -e {0..20} | xargs 

14 6 12 19 5 8 20 10 3 15 1 16 13 7 9 4 2 0 11 17 18

 


29 августа 2023 Bash awk haproxy


Задача, выделить из логов haproxy статусы запросов, бакенды обработчиков и урлы запросов, так же выводить количество счётчик статусов запросов

tail -f /var/log/haproxy-traffic.log |awk -F' ' '{if (NF == 20)  print $11,'\t', ++count[$11],'\t', $9, $19 }'

Программа awk состоит из условия и инкремента счётчика

if (NF == 20)  print $11,'\t', ++count[$11],'\t', $9, $19 }

здесь отбираются строки состоящие из 20 слов, выводится status_code запроса, а так же результат инкремента счётчика статусов

подобным образом можно организовать подсчёт количества обращений к бакенду и ссылкам

if (NF == 20)  print $11,'\t', ++count[$11],'\t',++count[$19],'\t',  $9, ++count[$19],'\t',  $19 }

 


13 апреля 2021 22 апреля 2021 Bash bash curl check 404 | решать тесты

  • Зачем нужна опция -q при использования утилиты curl


Список ссылок размещён в файле /tmp/pdf.csv
 

for u in $(cat /tmp/pdf.csv); do 
curl -I $u 2> /dev/null | grep 'HTTP/1.1 404' -q && echo 404 `basename $u` || echo ok `basename $u`  
done

 


28 декабря 2017 07 января 2018 Bash Bash mkdir


Когда сервере  необходимо на создать иерархию директорий то можно открыть mc и 23 раз запустить диалог создания директори или ручками создать всё что нужно с помощью команды mkdir, создать 3 родительских директории media/ , media/pages/ и media/products/ а затем ещё 20 раз для каждой директории

либо воспользоваться возможностями интерпретатора bash введя вот такие команды

mkdir -p media/pages/{0,1,2,3,4,5,6,7,8,9}  media/products/{0..9}

тут в одной строке используются два способа задать диапазон и очевидно, что второй лаконичнее и удобнее

(venv3)python@breys ❄  ls -R media/
media/:
pages  products

media/pages:
0  1  2  3  4  5  6  7  8  9

media/pages/0:
media/pages/1:
media/pages/2:
media/pages/3:
media/pages/4:
media/pages/5:
media/pages/6:
media/pages/7:
media/pages/8:
media/pages/9:
media/products:
0  1  2  3  4  5  6  7  8  9

media/products/0:
media/products/1:
media/products/2:
media/products/3:
media/products/4:
media/products/5:
media/products/6:
media/products/7:
media/products/8:
media/products/9: