Как подсчитать количество расширений параметров, арифметических расширений и т. Д.? [закрыто]

Попробуйте это с терминала:

ifconfig

Ваш MAC-адрес является адресом после HWaddr. Если это 00: 00: 00: 00: 00: 00 Я думаю, что что-то не так с аппаратным или драйвером.

Если вы каким-то образом удалили свой MAC-адрес из сетевых настроек, вы можете получить его назад, записав это в терминале:

sudo lshw > lshw.txt напишите пароль, когда будет предложено ввести его, это занимает приблизительно 20 секунд. gedit lshw.txt

Теперь вы просматриваете список всего своего оборудования. Но нам нужны только сетевые спецификации. Сделайте поиск по «сети». Пара строк под этой строкой должна быть такой:

serial: 01:21:ee:de:01:11

Только ваши номера будут разными. Это MAC-адрес. Скопируйте этот адрес и вставьте его в сетевые настройки. Затем вы должны восстановить исходный MAC-адрес.

1
задан 4 December 2017 в 12:53

2 ответа

Практический способ

Просто используйте grep с флагом -c для подсчета или еще лучше grep -o '<PATTERN>' | wc -l (см. примечание об этом позже в тексте). В зависимости от того, как вы хотите, чтобы ваш результат выглядел и в зависимости от того, что вы хотите достичь, существует множество способов его настройки.

Конечно, существуют разные типы расширения параметров, поэтому нам нужно будет написать для них разные шаблоны. Здесь я просто написал замену шаблонов, удаление префикса и арифметическое расширение, но вы можете адаптировать их к любому другому.

На самом базовом уровне мы можем назвать отдельные команды следующим образом:

$ cat ./myscript.sh #!/bin/bash var="string" echo "${var/string/thread}" echo $((2+2)) echo $((3*2)) echo ${var#*i} echo ${var##*i} echo ${var%i*} echo ${var%%i*} $ grep -c '${.*}' myscript.sh 1 $ grep -c '$((.*))' myscript.sh 2

И это только основная идея. Вы могли бы поместить несколько шаблонов grep в сценарий с хорошим лидирующим сообщением. Что-то вроде:

#!/usr/bin/env bash printf "\nNumber of arithmetic expansions:" grep -c '$((.*))' "$1" printf "\nNumber of substitutions:" grep -c '${.*\/.*\/.*}' "$1" printf "\nNumber of prefix removals:" grep -c '${.*[#]\{1,2\}.*}' "$1"

И затем назовите этот скрипт как:

./count_bash_stuff.sh myscript.sh

В качестве альтернативы просто поместите все шаблоны в файл и вызовите grep с -f. Конечно, он выведет только общее количество всех совпадений, а не отдельных:

$ cat ./patterns $((.*)) ${.*\/.*\/.*} ${.*[#]\{1,2\}.*} $ grep -c -f ./patterns ./myscript.sh 5

Примечание: как указано в комментарии ниже этого ответа, [t14] - инструмент для сопоставления строк, это означает, что если в строке больше одного шаблона, оно добавит 1 для подсчета только для этой строки. Лучшим подходом было бы использовать флаг -o с grep и передать вывод на wc -l. Таким образом, вместо этого мы могли бы сделать что-то подобное для арифметического расширения:

grep -o '$((.*))' | wc -l

Путь (не очень практичный) POSIX shell

Да, это возможное. Это сложно, но возможно с case заявлениями. Здесь я просто напишу инструкцию case для арифметического расширения и удаления самого длинного префикса. Остальное до читателя адаптируется и расширяется.

Опять же, имейте в виду, что это доказательство концепции. Обратите внимание, что это использует /bin/sh - на Ubuntu это совместимая с POSIX оболочка /bin/dash, а не bash.

#!/usr/bin/env sh while IFS="" read -r line || [ -n "$line" ]; do case "$line" in # arithmetic expansion, appearing anywhere in line *'$(('*'))'*) arithmetic_count=$(($arithmetic_count+1));; *'${'*##*'}'* ) prefix_count=$((prefix_count+1));; esac done < "$1" echo "$arithmetic_count" echo "$prefix_count"

И она работает так:

$ ./count_shell_stuff.sh myscript.sh 2 1

Почему это не так практично, вы можете спросить? Поскольку писать рисунки в case могут быть несколько сложными, и немного сложнее, чем в grep или Perl. Кроме того, вам потребуется написать case для каждой структуры синтаксиса оболочки. С помощью grep или perl вы можете объединить несколько шаблонов в один. Но опять же, это только мое личное мнение. Сравнение шаблонов строк по-прежнему очень возможно, как я показал в этом небольшом доказательстве концепции, но я бы не рекомендовал это как способ.

2
ответ дан 18 July 2018 в 02:03

Практический способ

Просто используйте grep с флагом -c для подсчета или еще лучше grep -o '<PATTERN>' | wc -l (см. примечание об этом позже в тексте). В зависимости от того, как вы хотите, чтобы ваш результат выглядел и в зависимости от того, что вы хотите достичь, существует множество способов его настройки.

Конечно, существуют разные типы расширения параметров, поэтому нам нужно будет написать для них разные шаблоны. Здесь я просто написал замену шаблонов, удаление префикса и арифметическое расширение, но вы можете адаптировать их к любому другому.

На самом базовом уровне мы можем назвать отдельные команды следующим образом:

$ cat ./myscript.sh #!/bin/bash var="string" echo "${var/string/thread}" echo $((2+2)) echo $((3*2)) echo ${var#*i} echo ${var##*i} echo ${var%i*} echo ${var%%i*} $ grep -c '${.*}' myscript.sh 1 $ grep -c '$((.*))' myscript.sh 2

И это только основная идея. Вы могли бы поместить несколько шаблонов grep в сценарий с хорошим лидирующим сообщением. Что-то вроде:

#!/usr/bin/env bash printf "\nNumber of arithmetic expansions:" grep -c '$((.*))' "$1" printf "\nNumber of substitutions:" grep -c '${.*\/.*\/.*}' "$1" printf "\nNumber of prefix removals:" grep -c '${.*[#]\{1,2\}.*}' "$1"

И затем назовите этот скрипт как:

./count_bash_stuff.sh myscript.sh

В качестве альтернативы просто поместите все шаблоны в файл и вызовите grep с -f. Конечно, он выведет только общее количество всех совпадений, а не отдельных:

$ cat ./patterns $((.*)) ${.*\/.*\/.*} ${.*[#]\{1,2\}.*} $ grep -c -f ./patterns ./myscript.sh 5

Примечание: как указано в комментарии ниже этого ответа, [t14] - инструмент для сопоставления строк, это означает, что если в строке больше одного шаблона, оно добавит 1 для подсчета только для этой строки. Лучшим подходом было бы использовать флаг -o с grep и передать вывод на wc -l. Таким образом, вместо этого мы могли бы сделать что-то подобное для арифметического расширения:

grep -o '$((.*))' | wc -l

Путь (не очень практичный) POSIX shell

Да, это возможное. Это сложно, но возможно с case заявлениями. Здесь я просто напишу инструкцию case для арифметического расширения и удаления самого длинного префикса. Остальное до читателя адаптируется и расширяется.

Опять же, имейте в виду, что это доказательство концепции. Обратите внимание, что это использует /bin/sh - на Ubuntu это совместимая с POSIX оболочка /bin/dash, а не bash.

#!/usr/bin/env sh while IFS="" read -r line || [ -n "$line" ]; do case "$line" in # arithmetic expansion, appearing anywhere in line *'$(('*'))'*) arithmetic_count=$(($arithmetic_count+1));; *'${'*##*'}'* ) prefix_count=$((prefix_count+1));; esac done < "$1" echo "$arithmetic_count" echo "$prefix_count"

И она работает так:

$ ./count_shell_stuff.sh myscript.sh 2 1

Почему это не так практично, вы можете спросить? Поскольку писать рисунки в case могут быть несколько сложными, и немного сложнее, чем в grep или Perl. Кроме того, вам потребуется написать case для каждой структуры синтаксиса оболочки. С помощью grep или perl вы можете объединить несколько шаблонов в один. Но опять же, это только мое личное мнение. Сравнение шаблонов строк по-прежнему очень возможно, как я показал в этом небольшом доказательстве концепции, но я бы не рекомендовал это как способ.

2
ответ дан 24 July 2018 в 17:30
  • 1
    Обратите внимание, что grep -c подсчитывает совпадение строк - поэтому будет ошибкой, если на данной строке больше одного шаблона. Вы можете попытаться исправить это, используя grep -o и вывести вывод , который - wc, однако вам нужно будет сделать шаблоны неживыми, например. [F4] – steeldriver 2 December 2017 в 21:25
  • 2
    @steeldriver Я думаю, вы имели в виду wc -l, но да, хорошая точка. Я включил это в ответ – Sergiy Kolodyazhnyy 3 December 2017 в 01:33

Другие вопросы по тегам:

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