Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Формирование списка. (http://forum.oszone.net/showthread.php?t=137320)

somes 10-04-2009 15:07 1089991

Формирование списка.
 
Добрые сутки.

Есть текстовый файл, экспортированный секьюрити лог, в нём события, даты, учётные записи за два месяца. Задача получить новый список с перечнем учётных записей, существующих в родительском списке, без дублирования.
o:\sec.txt - исходный файл
o:\fin.txt - созданный ручками пустой файл для конечного списка.

Незатейливо пишу в командлайне:
Код:

For /F "tokens=8" %a in (o:\sec.txt) do For /F "skip=2 tokens=1" %k in ('find "%a" o:\fin.txt') do IF NOT "%a" == "%k" echo %a >> o:\fin.txt
tokens=8 так как это подстрока с учётной записью в исходном списке. Казалось бы, куда проще - взять имя, провести поиск в конечном файле, отбросить лишний вывод, если совпадение есть - ничего не записывать, иначе записать имя учетной записи в конечныйфайл. Однако - не работает. Обидно. По ощущениям - если переменная %k не определена - то IF не работает вообще никак и никогда. DEFINED тоже прикрутить не вышло. Помогите, люди добрые. =)
Вот кусочек приближенного sec.txt для ясности:
Success Audit 10.04.2009 12:20:26 Security Logon/Logoff 540 pupkin
Success Audit 10.04.2009 12:20:26 Security Logon/Logoff 576 popkin
Success Audit 10.04.2009 12:19:01 Security Logon/Logoff 538 ivanov
Success Audit 10.04.2009 12:19:01 Security Logon/Logoff 538 petrov
Success Audit 10.04.2009 12:19:01 Security Logon/Logoff 538 sidorov
Success Audit 10.04.2009 12:19:01 Security Logon/Logoff 538 ivanov
Success Audit 10.04.2009 12:18:41 Security Logon/Logoff 576 popkin
Success Audit 10.04.2009 12:18:41 Security Logon/Logoff 528 ivanov
Success Audit 10.04.2009 12:18:41 Security Logon/Logoff 552 popkin
Success Audit 10.04.2009 12:18:40 Security Logon/Logoff 538 pupkin

gora 10-04-2009 15:23 1090007

Цитата:

Цитата somes
По ощущениям - если переменная %k не определена - то IF не работает вообще никак и никогда »

Попробуйте делать сравнение так:
Код:

... IF NOT "#%a" == "#%k" ...

somes 10-04-2009 15:32 1090018

до IF дело не доходит, дело во втором For. Если нет совпадений - ничего не проверяется, так как не выполняется условие второго цикла. А я хочу этот момент обойти, но не знаю - как. Чувствую - что через %errorlevel% вместо второго цикла. А вот с подробностями - запара, так как изменения %errorlevel% в конструкции вида
Код:

For /F "tokens=8" %a in (o:\sec.txt) do (find "%a" o:\fin.txt & if "%errorlevel%" == "1" echo %a >> o:\fin.txt)
запаздывает на одну интерацию цикла, что лишает его использование смысла...

Petya V4sechkin 10-04-2009 16:24 1090080

somes, можно так:
Код:

@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion

If Exist o:\fin.txt Del /F /Q o:\fin.txt
For /F "Tokens=7* Delims= " %%a In (o:\sec.txt) Do (
  FindStr /L /I /X /C:"%%b" o:\fin.txt 2>nul >nul
  If "!ErrorLevel!" Neq "0" Echo %%b>>o:\fin.txt
)

P. S. Вместо Find лучше использовать FindStr с соответствующими опциями (чтобы строка искалась целиком).

amel27 11-04-2009 09:58 1090732

Цитата:

Цитата somes
DEFINED тоже прикрутить не вышло »

в этом смысле что ли? =)
Код:

For /F "Tokens=8 Delims= " %a In (o:\sec.txt) Do If Not DEFINED $%a Set $%a=X&(@Echo %a>>o:\fin.txt)
P.S. не понятен один момент - AFAIK лог экспортируется с TAB-разделителями, т.е. "Success Audit" это вроде одно поле и позиция тогда должна быть 7-я, а у вас пробелы (кстати, табуляторы сохраняются только в тегах CODE)... но это так, отступление - исходим из того, что дано

Petya V4sechkin 11-04-2009 10:43 1090753

amel27, да, это гораздо быстрее, чем Find/FindStr.

amel27 11-04-2009 14:46 1090907

Petya V4sechkin, удивительно, что IF DEFINED работает с переменными периода выполнения

somes 13-04-2009 10:21 1092552

Большое спасибо, уважаемые, тему можно закрывать.


Время: 09:27.

Время: 09:27.
© OSzone.net 2001-