Я добавляю это, потому что когда-нибудь оно мне понадобится ... снова.
Иногда вы получаете неправильное соответствие номеров устройств Ethernet и MAC-адресов. Иногда это действительно важно, например, при работе в виртуальной машине, когда каждое устройство назначается отдельной VLAN.
/etc/udev/rules.d/70-persistent-net.rules
(или его эквивалент) udevadm control --reload-rules
триггер udevadm --attr-match = subsystem = net
Я был удивлен, насколько хорошо это сработало.
Предполагая, что под «ключом» вы подразумеваете «столбец», вы могли бы использовать что-то вроде этого:
cut -f 11 -d "|" $(find. -type f -iname "*.txt") | sort | uniq -d | sed 's/\\/./g' | while read duplicate; do grep -rHn "|$duplicate|" * ; done
Вам, вероятно, придется изменить содержимое $(find -iname)
на любое расширение, которое имеют ваши файлы журналов (, или просто удалить его, если единственными файлами в каталоге являются файлы журналов. Это рекурсивно найдет все файлы журналов и сопоставит их.
Вывод некоторых тестовых данных выглядит так:
test_data.txt:1:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msg|Country not known
test_data.txt:5:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msg|Country not known
test_data_2.txt:2:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msgIDONTMATCH|Country not known
test_data.txt:3:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msgIDONTMATCH|Country not known
test_data_2.txt:4:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msgIlikecake|Country not known
test_data.txt:7:Error: null, Data: |862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2010\07\05\ITE854075_RECardProtectionlogi.msgIlikecake|Country not known
Где это все строки в файлах с дублированным полем 11.
Объяснение того, что делает команда.
cut -f 11 -d "|"
Получить 11-е поле (с разделителями |)
find. -type f -iname "*.txt"
рассматривать любые файлы, оканчивающиеся на.txt в текущем каталоге (рекурсивно)
sort | uniq -d
показать все дублированные "поля 11"
sed /\\/./g'
Это хак, потому что \
испортил bash. Мы заменяем его на .
, который соответствует любому символу grep.
while read duplicate; do grep -rHn "|$duplicate|" *; done
-перебирать список дубликатов и находить все их вхождения, выводя имя файла и номера строк, в которых встречаются дубликаты.
Непонятно, что вы пытаетесь сделать, но я попробую:
Во-первых, какова ваша линия? Вы дали это как строку:
Error: null, Data:|862799|00318070L|EMA|EMAIL|null|20100705|2010-07-05 14:59:39.0|null|AUTO_20100705|2011\07\05\ITE854075_RECardProtectionlogi.msg|Country not known
Если ваши строки выглядят так, значит, ваш ключ находится в поле 11
2011\07\05\ITE854075_RECardProtectionlogi.msg
но что определяет ваш ключ? Это просто быть в поле 11?
Если это так, вы можете сделать что-то подобное в каталоге с вашими целевыми файлами:
sort --field-separator='|' --key=11 <(\grep --recursive --line-number --color=always --with-filename '' *)
это даст вам раскрашенный вывод имени файла, за которым следует номер строки в этом файле, а затем сама строка, все отсортированные по ключевому полю 11; поэтому в выводе все совпадающие ключи в любом файле появляются друг над другом...
Я думаю, что это даст вам ключ, по крайней мере
Обратите внимание:на обратную косую черту перед grep
, чтобы предотвратить любые псевдонимы grep
.