Полезные советы и скрипты (упрощающие работу в консоли)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20790
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Полезные советы и скрипты

Сообщение Bizdelnick »

olecya писала:
14.12.2020 11:21
Не все знают что в утилите ls есть опция игнорирования файлов по шаблону.
Тут неплохо бы уточнить, что она есть только в GNU ls. В POSIX такой опции нет, а в ls из FreeBSD, например, флаг -I имеет другое значение.
olecya писала:
14.12.2020 11:21
Обычно мы не замарачиваясь используем конвеер, например:

Shell

touch file{1,2}.txt
ls
file2.txt file3.txt file.txt
ls | grep -v '[0-9]'
file.txt
Для незаморочных, которые грепают вывод ls, у меня всегда наготове такой пример:

Shell

% ls
% touch 'file
quote> 1.txt'
% ls
'file'$'\n''1.txt'
% ls | grep -v '[0-9]'
file
%
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: Полезные советы и скрипты

Сообщение olecya »

Выводим массив в обратном порядке.
В данном примере зеркальное отражение массива имеющего ограничение по максимальному числу передаваемых параметров:

Shell

arr=(1 2 3 4 5 6)
bash -c '$0 $@ ${BASH_ARGV[@]}' echo ${arr[@]}
1 2 3 4 5 6 6 5 4 3 2 1
В скрипте также можно вывести полученные параметры через массив BASH_ARGV
А вот если вывести из функции то необходимо включить перед передачей опцию:
shopt -s extdebug
P.S. Буквально вчера с этим экспериментировала, поэтому могла где нить накосячить.
Спасибо сказали:
Аватара пользователя
Zer0
Сообщения: 479
ОС: Void, Slackware

Re: Полезные советы и скрипты

Сообщение Zer0 »

Чтобы не изобретать велосипеды:

- набор полезных скриптов bash для кучи типовых задач;
https://github.com/dylanaraps/pure-bash-bible

- примерно тоже самое, но только одной строкой;
https://linuxcommandlibrary.com/basic/oneliners.html
Memento mori ... сделай бэкап.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20790
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Полезные советы и скрипты

Сообщение Bizdelnick »

Zer0 писал(а):
09.06.2021 11:47
примерно тоже самое, но только одной строкой;
https://linuxcommandlibrary.com/basic/oneliners.html
Там преимущественно треш.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: Полезные советы и скрипты

Сообщение olecya »

Псевдоним vi для автоматического открытия файла сессии:[не правильно!]
Есть варианты с созданием файлов сессий в отдельной директории с именами проектов. По мне это довольно неудобно. У меня было организованно так. В корне проекта создается дефолтный файл сессии Session.vim и в дальнейшем открывается просто командой vim -S. Для меня редактор вим вездеход, открываю как отдельные файлы, без файлов, так и в проектах с файлом сессии где файлы открыты в табах. Довольно неудобно набирать vim -S принимая во внимание еще, что флаг вводится в верхнем регистре. В дополнение, совершенно не пользуюсь командой vi и решила это скомбинировать.

Код: Выделить всё

alias vi='[ $# -eq 0 -a -f Session.vim ] && vim -S || vim'
Теперь команда vi открывает файл сессии если он существует в текущей директории, если нет открывается пустой буфер редактора без получения ошибки об отсутствии файла сессии. Кроме того в корне проекта открываются любые файлы вне сохраненной сессии если у команды vi есть параметры.
Последний раз редактировалось olecya 18.06.2022 14:06, всего редактировалось 1 раз.
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: Полезные советы и скрипты

Сообщение olecya »

Да, тут я конечно накосячила, умудрилась передать параметр в синоним.

Код: Выделить всё

vi() {
        [ $# -eq 0 -a -f Session.vim ] && vim -S || vim -p $@
}
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: Полезные советы и скрипты

Сообщение olecya »

Недавно я шутки ради написала имя функции в кириллице и она сработала.

Shell

$ Функция() { echo hi; }
$ Функция
$ hi
Я наивно полагала что имена функций должны составляться так же как и имена переменных. Я еще не копала глубоко, но думаю это как то может быть полезным, в любом случае это интересно.

Shell

$ 10() { echo continue; }
$ 10
$ continue
$ ,() { echo это запятая; }
$ ,
$ это запятая
И даже некоторые операторы можно использовать:

Shell

$ =() { echo bye; }
$ =
$ bye
Спасибо сказали:
Аватара пользователя
algri14
Сообщения: 1369
ОС: Mageia 5.1 & 8 x86_64, KDE

Re: Полезные советы и скрипты

Сообщение algri14 »

Подскажите, можно ли в выводе команд консоли/терминала показать номера строк?
Не из файла, а только в самой консоли, настройки есть?
Про вывод из текстового файла знаю, но есть например команда от утилиты dnf
dnf list kernel*
вывод большой, пронумеровать можно? (без вывода в файл и обратно в консоль)
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20790
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Полезные советы и скрипты

Сообщение Bizdelnick »

algri14 писал:
21.11.2022 23:54
dnf list kernel*
вывод большой, пронумеровать можно?
dnf list kernel\* | cat -n
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2645
ОС: Gentoo

Re: Полезные советы и скрипты

Сообщение ormorph »

wc -l, если нужно просто подсчитать строки.
Спасибо сказали:
Аватара пользователя
algri14
Сообщения: 1369
ОС: Mageia 5.1 & 8 x86_64, KDE

Re: Полезные советы и скрипты

Сообщение algri14 »

Bizdelnick писал:
22.11.2022 00:47
dnf list kernel\* | cat -n
Спасибо, уже хорошо. А для чего обратная косая слеш? без неё выдаёт всё тоже самое.
Добавка в виде | cat -n хорошо работает в

Shell

rpm -qa | grep kernel | cat -n
1 kernel-userspace-headers-5.19.7-1.mga8
2 kernel-desktop-devel-5.19.7-1.mga8-1-1.mga8
3 kernel-desktop-5.10.16-1.mga8-1-1.mga8
а в dnf нумеруются ненужные текстовые строки

Shell

dnf list kernel* | cat -n
1 Последняя проверка окончания срока действия метаданных: 1 day, 8:13:35 назад, Вс 20 ноя 2022 20:41:22.
2 Установленные пакеты
3 kernel-desktop-5.10.16-1.mga8.x86_64 1-1.mga8 @System
...............................................
12 kernel-userspace-headers.x86_64 5.19.7-1.mga8 @System
13 Имеющиеся пакеты
14 kernel-desktop-5.10.19-1.mga8.x86_64 1-1.mga8 updates-x86_64
15 kernel-desktop-5.10.20-2.mga8.x86_64 1-1.mga8 updates-x86_64
от их нумерации похоже не избавиться, направление понял, попробую ещё поиграться с утилитой nl
И можно пояснить механику | cat -n ? в смысле как она нумерует терминал (про саму команду читал)
Добавлено (05:27):
ormorph писал(а):
22.11.2022 04:58
wc -l, если нужно просто подсчитать строки.
В некоторых случаях тоже пригодится, спасибо

Shell

dnf list kernel* | wc -l
481
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2645
ОС: Gentoo

Re: Полезные советы и скрипты

Сообщение ormorph »

algri14 писал:
22.11.2022 05:21
И можно пояснить механику | cat -n ? в смысле как она нумерует терминал (про саму команду читал)
Так по моему тут всё просто, номер + строка + символ LF(0x0A).
Разделителем строк является символ код которого соответствует шестнадцатеричному значению 0x0A.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20790
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Полезные советы и скрипты

Сообщение Bizdelnick »

algri14 писал:
22.11.2022 05:21
А для чего обратная косая слеш? без неё выдаёт всё тоже самое.
А Вы попробуйте сделать touch kernel123 и повторить.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20790
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Полезные советы и скрипты

Сообщение Bizdelnick »

algri14 писал:
22.11.2022 05:21
И можно пояснить механику | cat -n ? в смысле как она нумерует терминал (про саму команду читал)
| перенаправляет поток стандартного вывода dnf в поток стандартного ввода cat. Поскольку cat не передано ни одного файла в качестве аргумента, он выполняет чтение из потока стандартного ввода. После чего выводит, добавляя номера строк (за что отвечает опция -n).
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20790
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Полезные советы и скрипты

Сообщение Bizdelnick »

algri14 писал:
22.11.2022 05:21
попробую ещё поиграться с утилитой nl
Да, cat -n можно заменить на nl, результат будет тот же. Просто я про неё не вспомнил.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: Полезные советы и скрипты

Сообщение olecya »

Есть еще утилита nl. Имеет расширенный функционал:
dnf list kernel* | nl -bp'devel'
Добавлено (13:46):
algri14 писал:
22.11.2022 05:21
от их нумерации похоже не избавиться,
dnf list kernel* | nl -bp'kernel'
Добавлено (13:47):
dnf list kernel* | nl -bp'\.x86_64'
Спасибо сказали:
Аватара пользователя
algri14
Сообщения: 1369
ОС: Mageia 5.1 & 8 x86_64, KDE

Re: Полезные советы и скрипты

Сообщение algri14 »

olecya писала:
22.11.2022 13:40
Есть еще утилита nl. Имеет расширенный функционал:
dnf list kernel* | nl -bp'kernel'
Прекрасно! только вот в ней без обратной слеши выдаёт ошибку, добавил и отлично

Shell

dnf list kernel\* | nl -bp'kernel'
Последняя проверка окончания срока действия метаданных: 1 day, 18:31:19 назад, Вс 20 ноя 2022 20:41:22.
Установленные пакеты
1 kernel-desktop-5.10.16-1.mga8.x86_64 1-1.mga8 @System
2 kernel-desktop-5.15.65-1.mga8.x86_64 1-1.mga8 @System
3 kernel-desktop-5.19.7-1.mga8.x86_64 1-1.mga8 @System
.......................... и т. д. ..................
Добавлено (15:21):
olecya писала:
22.11.2022 13:40
dnf list kernel* | nl -bp'\.x86_64'
Да-да, отлично, буду иметь ввиду, но со слешью → dnf list kernel\* | nl -bp'\.x86_64'
Я тоже потихоньку начал изучать "птичий" язык, увлекательное занятие, но временами моск трещит :D
Спасибо сказали:
Аватара пользователя
algri14
Сообщения: 1369
ОС: Mageia 5.1 & 8 x86_64, KDE

Re: Полезные советы и скрипты

Сообщение algri14 »

Маялся бессонницей, наткнулся на домашку от студента, для себя я её немного изменил.
Как пронумеровать текст в файле через одну строку, чтобы консоль пронумеровала, например все нечётные, а потом все чётные строки.
По отдельности я нашёл подсказку:
cat -n /путь/имя_файла.txt | sed -n '1~2p'
cat -n /путь/имя_файла.txt | sed -n '2~2p'
А вот весь файл сразу вывести не могу, стало любопытно, третью ночь мучаюсь :D (и с файлом, и с бессонницей :dry: )
Команда желательно однострочная.
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2645
ОС: Gentoo

Re: Полезные советы и скрипты

Сообщение ormorph »

algri14 писал:
29.03.2023 04:05
А вот весь файл сразу вывести не могу, стало любопытно, третью ночь мучаюсь

Shell

$ echo -e {a,b,,c,d,e,f,g,h,i,j,k,l,m,n,o}.txt|tr " " "\n" >test.txt

Shell

$ cat -n test.txt |awk "NR%2==1" >test1.txt
$ cat -n test.txt |awk "NR%2==0" >test2.txt

Shell

cat test1.txt test2.txt |sort -nk1
Как то так.
Если нужно получить одним выводом сначала нечётные, а потом четные, то можно так:

Shell

$ printf "$(cat -n test.txt|awk "NR%2==1")\n$(cat -n test.txt|awk "NR%2==0")\n"
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: Полезные советы и скрипты

Сообщение olecya »

algri14
Чтобы не делиться бессонницей задавая подобные вопросы, есть отличный механизм основанный на конкретном примере, исключающий неопределенности. Например. У меня есть файл:
cat file

Код: Выделить всё

A
a
B
b
C
c
D
Ожидаемый результат:

Код: Выделить всё

1 A
2 B
3 C
4 D
5 a
6 b
7 c
Но на мой взгляд, вместо того чтобы все это объяснять, достаточно привести ответ в том виде как я это понимаю и оставить оппоненту самому уточнять задачу:

Код: Выделить всё

awk 'NR==FNR && NR%2 {print ++j,$0} NR!=FNR && !(FNR%2) {print ++j,$0}' file{,}
Примечание:
file{,} - После раскрытия оболочкой получаем - file file, а значит если используемая оболочка не умеет Brace Expansion, то вместо этой конструкции достаточно указать два раза имя файла.

Ладно, оставлю и альтернативу:

Код: Выделить всё

awk 'NR==FNR && NR%2 {print NR,$0} NR!=FNR && !(FNR%2) {print FNR,$0}' file{,}
Последний раз редактировалось olecya 29.03.2023 12:56, всего редактировалось 1 раз.
Спасибо сказали:
Аватара пользователя
algri14
Сообщения: 1369
ОС: Mageia 5.1 & 8 x86_64, KDE

Re: Полезные советы и скрипты

Сообщение algri14 »

ormorph писал(а):
29.03.2023 11:06
echo -e {a,b,,c,d,e,f,g,h,i,j,k,l,m,n,o}.txt|tr " " "\n" >test.txt
не катит, перечислять вручную перечисление, на крайний случай, вечером попробую
ormorph писал(а):
29.03.2023 11:06
$ cat -n test.txt |awk "NR%2==1" >test1.txt
$ cat -n test.txt |awk "NR%2==0" >test2.txt
это я тоже видел в инете и у меня тот же результат (команда другая)
ormorph писал(а):
29.03.2023 11:06
cat test1.txt test2.txt |sort -nk1
ormorph писал(а):
29.03.2023 11:06
$ printf "$(cat -n test.txt|awk "NR%2==1")\n$(cat -n test.txt|awk "NR%2==0")\n"
тоже не то, надо было в первом посте показать, нумерация цикличная, через строчку:
Spoiler
1.текст текст 3.текст текст 5.текст текст 7.текст
Второй вариант
текст 2.текст текст 4.текст текст 6.текст текст
вместо точки после цифры ещё вариант со скобкой (указать) где эта скобка, чтобы менять её на точку или вообще без точки(без скобки)
Добавлено (12:46):
olecya писала:
29.03.2023 12:40
есть отличный механизм основанный на конкретном примере, исключающий неопределенности.
да, извините, уже показал пример (до вечера, бегу на работу)
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: Полезные советы и скрипты

Сообщение olecya »

awk -v d=") " 'NR==FNR && NR%2 {$1 = NR d $0} NR!=FNR && !(FNR%2) {$1 = FNR d $0}1' file{,} 1) A a 3) B b 5) C c 7) D A 2) a B 4) b C 6) c D

Изменяете на точку с пробелом -v d=". " и всего делов.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20790
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Полезные советы и скрипты

Сообщение Bizdelnick »

sed '1~2=' <файл>
sed '0~2=' <файл>
Но это только для GNU sed. То же самое переносимо:
sed '=;N'
sed 'n;='
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2645
ОС: Gentoo

Re: Полезные советы и скрипты

Сообщение ormorph »

Если только для одного файла, и вывод по отдельности, то хватит просто:

Shell

awk 'NR%2==1 {$1 = NR ") " $0}1' file

Shell

awk 'NR%2==0 {$1 = NR ") " $0}1' file
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20790
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Полезные советы и скрипты

Сообщение Bizdelnick »

На переносимом awk (без косяков в случае наличия пробелов в строках):
awk 'NR%2==1 { printf "%d ", NR } { print }' <файл>
awk 'NR%2==0 { printf "%d ", NR } { print }' <файл>
Добавлено (15:23):
И на чистом POSIX-совместимом шелле:
{ n=1; while read l; do if [ $((n%2)) -eq 1 ]; then echo "$n $l"; else echo "$l"; fi; n=$((n+1)); done } <<файл>
{ n=1; while read l; do if [ $((n%2)) -eq 0 ]; then echo "$n $l"; else echo "$l"; fi; n=$((n+1)); done } <<файл>
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2645
ОС: Gentoo

Re: Полезные советы и скрипты

Сообщение ormorph »

Bizdelnick писал:
29.03.2023 15:13
awk 'NR%2==1 { printf "%d ", NR } { print }' <файл>
awk 'NR%2==0 { printf "%d ", NR } { print }' <файл>
Это наиболее правильный вывод. Что у меня что у Олеси, вывод неправильный, если в тексте полно пробелов, по этому нужно просто заменить первый столбец:

Shell

$ awk 'NR%2==1 { $1=NR ") " $1 }1' file
$ awk 'NR%2==0 { $1=NR ") " $1 }1' file
Спасибо сказали:
Аватара пользователя
algri14
Сообщения: 1369
ОС: Mageia 5.1 & 8 x86_64, KDE

Re: Полезные советы и скрипты

Сообщение algri14 »

Народ, всем спасибо, посижу проверю/сравню команды. Когда увидел вопрос от студента, то самому стало интересно, а в инете только стандартная нумерация. Глубже копнуть не смог, особенно запутана awk, хотя вроде как лучше остальных, здесь ещё предложили короткие варианты, в инете на всю ширину страницы, ваЩе ребус :D
Формулировка у студента тоже не совсем понятная в вопросе, ему пронумеровали все строки нечётными цифрами:

Shell

awk 'BEGIN{i=1} {if($0 !~ /^$/) {printf ("%d.%s \n",i++,$0); i++} else { print $0} } ' YourFileName.txt
даже не знаю где это может пригодится?
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2645
ОС: Gentoo

Re: Полезные советы и скрипты

Сообщение ormorph »

algri14 писал:
29.03.2023 21:57
Формулировка у студента тоже не совсем понятная в вопросе, ему пронумеровали все строки нечётными цифрами:
Там вообще довольно странный подход. Если по условию должны быть пронумерованы все строки, то там ещё игнорируются пустые строки:
algri14 писал:
29.03.2023 21:57
if($0 !~ /^$/)
Спасибо сказали:
Ответить