В качестве альтернативного подхода я иногда использовал простые номера строк в качестве запутывающего значения. Это делает вывод более компактным и более читабельным.
Кроме того, awk
– хороший инструмент, когда нужно выполнять "умные" операции с текстовым файлом, имеющим более читаемый язык, чем sed
. «Умная» операция, которую необходимо выполнить в этом случае, состоит в том, чтобы избежать повторного -выполнения алгоритма запутывания, когда какой-либо один MAC-адрес встречается более одного раза. Это может значительно ускорить работу, если у вас есть тысячи строк, относящихся к небольшому количеству MAC-адресов.
На практике рассмотрим следующий сценарий, который также обрабатывает возможные множественные MAC-адреса, встречающиеся в любой строке, идентифицируя и заменяя каждое вхождение, а затем печатает таблицу сопоставления в конце:
awk -v pat='clientMac"\\s*"[[:xdigit:]]{12}' -v table='sort -k 1,1n | column -t' -- '
$0 ~ pat {
for (i=1; i <= NF; i++)
if (match($i, pat)) {
if (!($i in cache))
cache[$i]=NR "." i
$i = "MAC:" cache[$i]
}
}
1
END {
print "---Table: "FILENAME"\nnum MAC" | table
for (mac in cache)
print cache[mac], mac | table
}
' file.log
Таблицу в конце можно легко отделить от основного вывода дополнительным шагом редактирования или просто заставив командную строку в аргументе -v table=
перенаправить вывод в файл, как в -v table='sort -k 1,1n | column -t > table'
. Его также можно полностью удалить, просто удалив весь блок END{ … }
.
Как вариант, использование реального механизма шифрования для вычисления значений запутывания и, следовательно, отсутствие таблицы сопоставления в конце:
awk -v pat='clientMac"\\s*"[[:xdigit:]]{12}' -v crypter='openssl enc -aes-256-cbc -a -pass file:mypassfile' -- '
$0 ~ pat {
for (i=1; i <= NF; i++)
if (match($i, pat)) {
addr = cache[$i]
if (addr == "") {
"echo '\''" $i "'\'' | " crypter | getline addr
cache[$i] = addr
}
$i = "MAC:" addr
}
}
1
' file.log
Здесь я использовал openssl
в качестве механизма шифрования, выбрав его aes-256-cbc
шифр (с выходом в кодировке base64 -, чтобы он был текстовым -дружественным ), и заставил его читать секрет шифрования. из файла с именем mypassfile
.
Строки, зашифрованные с помощью симметричного шифра (типа aes-256-cbc
), можно расшифровать, зная секрет, используемый (содержимое mypassfile
, которое вы хотите сохранить для себя ), поэтому их можно обратить. Кроме того, поскольку openssl
по умолчанию использует случайную соль, каждый запуск выдает разные значения для одного и того же ввода. Неиспользование параметра соли (-nosalt
)приведет к тому, что openssl
выдаст одно и то же значение для каждого запуска,поэтому менее безопасный, но, с другой стороны, будет создавать более короткие тексты, все еще будучи зашифрованными.
Тот же сценарий awk
будет работать для других внешних команд вместо openssl
, просто заменив команду в аргументе -v crypter=
на awk
, если выбранная вами внешняя команда может принимать ввод со стандартного ввода и вывод на стандартный вывод.
Строки, хешированные с помощью таких алгоритмов, как MD5 или SHA, являются односторонними -только (, т. е. они не могут быть реверсированы )и всегда дают одно и то же значение для одних и тех же входных данных, поэтому вы захотите «посолить» их, чтобы вычисленные значения, полученные на выходе, нельзя было просто искать по всем возможным MAC-адресам. Вы можете добавить случайную «соль», как в следующем слегка измененном скрипте:
awk -v pat='clientMac"\\s*"[[:xdigit:]]{12}' -v crypter='sha256sum' -- '
$0 ~ pat {
for (i=1; i <= NF; i++)
if (match($i, pat)) {
addr = cache[$i]
if (addr == "") {
"(dd if=/dev/random bs=16 count=1 2>/dev/null; echo '\''" $i "'\'') | " crypter | getline addr
cache[$i] = addr
}
$i = "MAC:" addr
}
}
1
' file.log
Этот последний сценарий использует 16-байтовое -длинное (псевдослучайное -)значение в качестве «соли», таким образом создавая разные хэш-значения при каждом прогоне одних и тех же данных.