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.
Эта штука использовалась XFree86/Xorg для управления графическими адаптерами!
Вы забыли упомянуть прерывания. Это сложная часть. К счастью, это стандартизировано для современных устройств PCI, поэтому они могут управляться без необходимости в драйвере ядра -для конкретного устройства. См. Userspace I/O HOWTO :Универсальный драйвер PCI UIO
.
Я не уверен, каковы точные детали и ограничения для доступа к устройствам PCI.
DMA не поддерживается. Вы можете написать минимальный драйвер UIO, позволяющий отображать часть памяти для прямого доступа к памяти. См. UIO, как -. Затем ваш драйвер пользовательского пространства может тщательно указать устройству, куда DMA. Если вы ошибетесь, устройство может записать в любое место вашей системной оперативной памяти. Весело!
Нет ничего плохого в объединении 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
можно найти здесь .
Пробовали ли вы фильтровать с разделителем ()?
awk '$9=="404" {print $7}' testfile.txt|sort -u
Или с этим:
grep 404 testfile.txt | cut -f 7 -d ' '|sort -u
П.С. Второй способ подойдет, например, когда длина загрузки составляет 404 байта. Или год содержит строку 404. Или запрошенный URL содержит эту строку.
Использование команды 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