PDA

Показать полную графическую версию : [решено] Формирование списка.


somes
10-04-2009, 15:07
Добрые сутки.

Есть текстовый файл, экспортированный секьюрити лог, в нём события, даты, учётные записи за два месяца. Задача получить новый список с перечнем учётных записей, существующих в родительском списке, без дублирования.
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 тоже прикрутить не вышло. Помогите, люди добрые. =) 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
По ощущениям - если переменная %k не определена - то IF не работает вообще никак и никогда »
Попробуйте делать сравнение так:... IF NOT "#%a" == "#%k" ...

somes
10-04-2009, 15:32
до 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
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
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
amel27, да, это гораздо быстрее, чем Find/FindStr.

amel27
11-04-2009, 14:46
Petya V4sechkin, удивительно, что IF DEFINED работает с переменными периода выполнения

somes
13-04-2009, 10:21
Большое спасибо, уважаемые, тему можно закрывать.




© OSzone.net 2001-2012