Как "запустить 'dmesg', используя только команду 'find'"?

К сожалению, в POSIX или любом другом awk, отличном от -busybox, требуется цикл для всех уникальных символов в каждой строке, поскольку обратные ссылки не поддерживаются в регулярном выражении:

$ cat tst.awk
{
    old = new = $0
    while (old != "") {
        char = substr(old,1,1)
        gsub(char,"",old)
        if ( char ~ /[[:alnum:]_]/ ) {
            gsub(char char,char char char,new)
        }
    }
    print new
}

$ echo ab aa cc de mn | awk -f tst.awk
ab aaa ccc de mn

Описанное выше работает, когда целевые символы не являются метасимволами регулярного выражения, как в этом случае. Если бы они могли быть метасимволами RE, вам нужно было бы экранировать их, прежде чем использовать их в контексте регулярного выражения gsub ()s. Вы можете использовать char"{2}"вместо char charв регулярном выражении gsub (), если хотите.

См. ответ @Stephane о том, как выполнить эту задачу с помощью busybox awk.

-1
07.10.2021, 20:10
2 ответа

Выполнение одиночных команд — это то, что findможно сделать, но вы никогда не будете использовать его для выполнения. Это немного похоже на придумывание одной из тех бесполезных машин, видео о которых можно найти на YouTube .

Используя стандартный find, вы можете выполнить dmesgс помощью следующей команды.

find. -prune -exec dmesg \;

В этой команде findмы пытаемся выполнить dmesg, используя -execдля текущего каталога, и мы используем -prune, чтобы избежать поиска чего-либо в текущем каталоге. Когда больше нечего исследовать, findзаканчивается.

Команда не зависит от того, какой путь поиска мы даем find, кроме того, что он должен существовать. Это также не зависит от того, разрешено ли текущему пользователю выполнять dmesgили иметь dmesgв своем $PATH. Команда запустит утилиту dmesgпрактически так же, как если бы она выполнялась непосредственно из командной строки.

2
08.10.2021, 12:05

Учитывая то, что было написано в комментариях, я думаю, что правильный ответfind / -name dmesg -type f -executable -exec {} \;

0
09.10.2021, 14:31

Теги

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