Как передать строку в awk для математических вычислений?

Используйте программу wmctrl .

пример (сделанный с KDE как DE)

#list open windows
wmctrl -l
0x01e001a6 -1 HOSTNAME plasma-desktop
0x01e007c1 -1 HOSTNAME plasma-desktop
0x01e00194 -1 HOSTNAME plasma-desktop
0x01e0019d -1 HOSTNAME plasma-desktop
0x03c00064  0 HOSTNAME Inbox - Mozilla Thunderbird
0x0240001a  0 HOSTNAME pam.d : bash – Konsole
0x04e00009  0 HOSTNAME 
0x03e0006e  0 HOSTNAME shell - check the list of Open window - Unix & Linux Stack Exchange - Mozilla Firefox
0x03e6efe3  0 HOSTNAME Mozilla Firefox


#now close the empty firefox session: (-c for close, -i for using the hexnumber of the first column as identifier)
wmctrl -ic 0x03e6efe3

Вы также можете использовать эту программу для изменения геометрии окон, выбора окон, перемещения окон, изменения заголовков окон и т. Д. Проверьте man wmctrl для просмотра возможностей .

1
02.03.2019, 01:56
4 ответа

Хотя это работает, я не рекомендую это делать, потому что, если вы не контролируете источник expression_to_evaluate, это угроза безопасности:

$ expression_to_evaluate='12 + 3'
$ awk "BEGIN{printf \"%d\n\", $expression_to_evaluate}"
15
2
27.01.2020, 23:22
echo $expression_to_evaluate | awk -F "+" '{print ($1+$2)}'
0
27.01.2020, 23:22

awkне имеет способа вычислить общее арифметическое выражение, переданное ему в виде строки. bc, с другой стороны, берет выражение и вычисляет его, как это делает оболочка.

Если вы хотите оценить строку как математическое выражение в awk, вам нужно либо внедрить выражение как код в программу awk(, потенциально создающую уязвимость внедрения кода. ), или просто напишите свой собственный синтаксический анализатор для типов выражений, которые вы хотите оценить (это обычное домашнее задание по информатике ).

Вы получаете 12из кода awk, потому что значение expression_to_evaluateпри преобразовании в целое число может быть преобразовано до символа пробела в строке. Вот как работает библиотечная функция strtol()C, когда она преобразует строку в целое число, и awk, вероятно, использует это под капотом.

2
27.01.2020, 23:22

Если вы хотите добавить 2 числа с помощью awk, используйте команду ниже

awk '{print 12 + 3;exit}'

output
15
0
27.01.2020, 23:22

Теги

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