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

Q. IN and OUT instructions are privileged instructions, so you need to be in kernel mode to use them

iopl(). Если номера портов достаточно малы, у вас также есть возможность использовать ioperm().

По-видимому, поддерживается не на всех архитектурах.

См. Использование inb, inl, inw для доступа к пространству ядра из пространства пользователя . Это ссылка на как -, а также на обновление примера кода.

Q. If the IO device is using memory-mapped IO, the IO device registers will be mapped to the kernel space memory, and you need to be in kernel mode to access the kernel space memory.

/dev/mem

Эта штука использовалась XFree86/Xorg для управления графическими адаптерами!

Вы забыли упомянуть прерывания. Это сложная часть. К счастью, это стандартизировано для современных устройств PCI, поэтому они могут управляться без необходимости в драйвере ядра -для конкретного устройства. См. Userspace I/O HOWTO :Универсальный драйвер PCI UIO

.

Я не уверен, каковы точные детали и ограничения для доступа к устройствам PCI.

DMA не поддерживается. Вы можете написать минимальный драйвер UIO, позволяющий отображать часть памяти для прямого доступа к памяти. См. UIO, как -. Затем ваш драйвер пользовательского пространства может тщательно указать устройству, куда DMA. Если вы ошибетесь, устройство может записать в любое место вашей системной оперативной памяти. Весело!

0
12.12.2019, 22:03
3 ответа

Нет ничего плохого в объединении cutкоманд вместе, как вы сделали, однако вы должны знать, что для больших входных данных могут быть более эффективные способы выполнения этой операции. Это связано с тем, что в вашем примере входной файл должен быть обработан командой 5 раз, прежде чем он будет выведен на терминал (, один раз для фильтрации grep, три отдельные команды анализа cutи один раз дляsort). Использование меньшего количества конвейеров может повысить производительность, но в конечном счете это зависит от самих команд и операций, которые они выполняют (, т. е. три быстрых и простых операции быстрее, чем одна большая операция с большими объемами вычислений ). Однако, если входные данные относительно малы, не имеет значения, используете ли вы свой метод конвейерной передачи или один из следующих ниже.

Примечание:Я не уверен в эффективности или скорости следующих примеров по сравнению с исходной цепочкой команд OP.В зависимости от варианта использования некоторые могут быть «лучше», чем другие.

Рекомендуется использоватьawk:()

awk '$9=="404" {print substr($7,2)","}' testfile.txt

Вышеприведенное похоже на ответ Ромео, однако это дополнительно удаляет предшествующую косую черту из имени файла в выводе журнала и добавляет запятую в конце, чтобы соответствовать желаемому результату. awk— это команда, которая анализирует входные данные (по умолчанию )построчно, разделяя каждую строку (по умолчанию )пробелом. Эта команда проверяет 9-е поле (Код ответа HTTP )на 404и, если он совпадает, она берет подстроку 7-го поля от 2-го символа до конца(substr($7,2))и добавляет запятую к этому (","). ] перед печатью вывода. Подробнее оawkможно прочитать здесь .

Используя ваш пример с одним cut+sed:

grep '" 404' testfile.txt | cut -d' ' -f7 | sed 's/\///; s/$/,/'

Вам не нужны три отдельные команды вырезания для извлечения имени файла, вам нужна только одна при использовании разделителя пробелов. Команда cutвытянет строку /403dz2.html. Затем sedвозьмет это, удалит предыдущую косую черту(s/\///)и добавит запятую в конец(s/$/,/). sedна самом деле делает здесь подстановку. Строка s/replace this/with this/указывает sedзаменить первую строку строки(replace this)второй строкой (with this). Первая подстановочная команда указывает sedзаменить /ничем, а вторая говорит «заменить» конец строки($)на ,. Подробнее оsedможно прочитать здесь . Также обратите внимание, что я grepиспользую для " 404, это своего рода хакерство, но оно не позволит grepвозвращать строки, где 404 появляется в другом месте (, например, имя файла, размер файла, дата и т. д. ).

Использованиеperl:

grep '" 404' testfile.txt | perl -lane 'print substr($F[6],1).","'

Это похоже на пример awk, но с использованием grepдля фильтрации ввода. Используя ту же идею, что и с awk, мы печатаем подстроку 7-го поля(substr($F[6],1))и добавляем к этому выводу запятую(.",").Имейте в виду, что perl начинает считать с нуля, а awk начинает считать с 1, поэтому мы используем $F[6]в perlдля извлечения 7-го поля, тогда как as $7используется в awk. Руководство perlможно найти здесь .

1
28.01.2020, 02:29

Пробовали ли вы фильтровать с разделителем ()?

awk '$9=="404" {print $7}' testfile.txt|sort -u

Или с этим:

grep 404 testfile.txt | cut -f 7 -d ' '|sort -u

П.С. Второй способ подойдет, например, когда длина загрузки составляет 404 байта. Или год содержит строку 404. Или запрошенный URL содержит эту строку.

1
28.01.2020, 02:29

Использование команды awk:

awk -F '[ /]' '/ 404 / {print $10|"sort -u"}' testfile.txt

Пояснение:

  • -F '[ /]':используйте пробелы " " и косую черту "/" в качестве разделителей. (множественный разделитель)
  • / 404 /:соответствуют только строки, содержащие " 404 ". Так же, как grep " 404 " testfile.txtработает.

Примечание:есть некоторый интервал до и после «404».

Это устраняет любые ложные совпадения, которые могут появляться в URL-адресе вместо кода ответа. Например, следующая строка НЕ ​​будет соответствовать:

ip - - [12/Dec/2019:13:18:00 +0000] "GET /test404.html HTTP/1.1" 200 710 "-" "python-requests/2.18.4"

Примечание:test404.html URL-адрес содержит 404 , но код ответа — 200 . Отсюда необходимость в промежутках до и после «404».

  • print $10:используя пробелы и косые черты в качестве разделителя, отобразить 10-е поле.
  • | sort -u:сортировать результаты, беря только один экземпляр, где есть дубликат. (т.е. отображать уникальные строки)
  • testfile.txt:файл, содержащий строки для сопоставления.

Примечание:Предполагая, что есть другие строки с 404, но они не представляют интереса, вы можете усилить сопоставление, используя следующее:

awk -F '[ /]' '/GET.* 404 / {print $10|"sort -u"}' testfile.txt

Что было изменено:

  • /GET.* 404 /:соответствуют только строки, которые содержат " GETс последующими другими элементами, затем 404"

НАКОНЕЦ-ТО:

  • Если вы хотите использовать косую черту перед URL-адресом, используйте:

    awk '/ 404 / {print $7|"sort -u"}' testfile.txt
    
  • Если вы хотите поставить запятую после URL,использовать:

    awk -F '[ /]' '/ 404 / {print $10","|"sort -u"}' testfile.txt
    
  • Если вы хотите использовать ОБЕ СКОСНУЮ ЧАСТЬ перед URL-адресом и ЗАПЯТУЮ после URL-адреса, используйте:

    awk '/ 404 / {print $7","|"sort -u"}' testfile.txt
    
0
28.01.2020, 02:29

Теги

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