2016-01-29 4 views
1

Я пытаюсь сравнить список IP-адресов и вывести разницу с помощью команды findstr в Windows, и мне трудно заставить ее работать. Команда, я использую это:findstr: слишком длинные строки поиска

EDIT: Моя цель состоит в том, чтобы сравнить IP-адреса, которые были успешно отсканированы IP-адреса, которые были отсканированы успешно с аутентификационными достигнуто и выводить его файлы, которые не IPsSuccessfullyScannedwithAuthentication.txt но находятся в IPsSuccessfullyScanned.txt до IPsSuccessfullyScannedButNotAuthenticated.txt.

Скажем IPsSuccessfullyScanned.txt содержат

192.168.0.1

192.168.0.2

192.168.0.3

192.168.0.4

192.168.0.5

192.168.0.6

192.168.0.7

192.168.0.8-192.168.0.12

и IPsSuccessfullyScannedwithAuthentication.txt (которые являются IP-адресов, которые аутентифицированы и были успешно сканироваться) содержат

192.168.0.1

192.168.0.2

192.168.0.3

192.168.0.4

192.168.0.6

192.168.0.8-192.168.0.10

192.168.0.12

Мой IPsSuccessfullyScannedButNotAuthent icated.txt должны иметь это:

192.168.0.5

192.168.0.7

192.168.0.11

Findstr /vixg:IPsSuccessfullyScanned.txt IPsSuccessfullyScannedwithAuthentication.txt> IPsSuccessfullyScannedButNotAuthenticated ,TXT

То, что я пытаюсь добиться очень похож на этот пост:

.bat file to compare two text files and output the difference

Вот мой вопрос, хотя, размер файла в IPs2.txt составляет 720 байт. Когда я исследовал команду findstr, я обнаружил, что при поиске регулярного выражения максимальная длина строки поиска составляет 254 байта. Регулярное выражение длиной от 255 до 511 байт приведет к ошибке FINDSTR: Ошибка в памяти с ERRORLEVEL 2.

Длина регулярного выражения> 511 байт приводит к FINDSTR: строка поиска слишком длинная. ошибка.(это ошибка, которую я сейчас получаю).

Мой вопрос: Какие существуют альтернативы, которые я могу использовать, чтобы иметь возможность сравнивать два текстовых файла? Если есть какие-либо другие предложения по разрешению моей проблемы как можно проще, даже файл bat может помочь, если это возможно.

Ссылки:

http://ss64.com/nt/findstr-escapes.html

What are the undocumented features and limitations of the Windows FINDSTR command?

+0

Извините, но ваш вопрос непонятен. Что вам нужно в результате? Строки в IPs2.txt, которые не существуют в IPs1.txt? Наоборот? И то и другое? Другой? – Aacini

+0

Для обоих @Aacini – therealjsevilla

ответ

0
@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
SET "filename1=%sourcedir%\q35090416.txt" 
SET "filename2=%sourcedir%\q35090416_2.txt" 
:: remove variables starting $ 
FOR /F "delims==" %%a In ('set $ 2^>Nul') DO SET "%%a=" 
:: Read first file into memory 
FOR /f "tokens=1*delims=]" %%a IN ('find /n /v "" "%filename1%"') DO SET "$%%a=%%b" 
FOR /f "usebackqdelims=" %%a IN ("%filename2%") DO (
SET "same=" 
FOR /f "tokens=1*delims==" %%b IN ('SET $ 2^>nul') DO (
    IF /i "%%a"=="%%c" SET "same=y" 
) 
IF NOT DEFINED same ECHO(%%a 
) 

GOTO :EOF 

Вам нужно будет изменить настройки sourcedir и filename* в соответствии с вашими обстоятельствами.

Я использовал файлы с именем q35090416*.txt, содержащие некоторые фиктивные данные для моего тестирования.

Отчет, созданный этой подпрограммой, представляет собой строки, содержащиеся во втором файле, которые не содержатся в первом, который является объектом вашей команды findstr /vixg. Пожалуйста, четко объясните, что вы пытаетесь сделать - мы не можем исправить что-то, что не работает, если мы не знаем точно, что это за объект.

У программы могут быть проблемы, если какая-либо строка начинается ] или с любыми обычными проблемами, возникающими при обработке пакетной строки.


Ваши правки радикально изменили проблему. Эта проблема имеет много общего с содержанием файлов. Предел в 254 символа для findstr является пределом в строке, а не файла в целом.

@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
SET "filename1=%sourcedir%\q35090416.txt" 
SET "filename2=%sourcedir%\q35090416_2.txt" 
:: remove variables starting $ 
FOR /F "delims==" %%a In ('set $ 2^>Nul') DO SET "%%a=" 
:: Read first file into memory 
FOR /f "usebackqtokens=1*delims=-" %%a IN ("%filename2%") DO (
IF "%%b"=="" (SET "$%%a=Y") ELSE (
    FOR /f "tokens=1-4,8delims=." %%p IN ("%%a.%%b") DO FOR /l %%x IN (%%s,1,%%t) DO SET "$%%p.%%q.%%r.%%x=y" 
) 
) 
FOR /f "usebackqtokens=1*delims=-" %%a IN ("%filename1%") DO (
IF "%%b"=="" (IF NOT DEFINED $%%a ECHO %%a) ELSE (
    FOR /f "tokens=1-4,8delims=." %%p IN ("%%a.%%b") DO FOR /l %%x IN (%%s,1,%%t) DO (
    IF NOT DEFINED $%%p.%%q.%%r.%%x ECHO %%p.%%q.%%r.%%x 
) 
) 
) 

GOTO :EOF 

Это решение должно соответствовать. Я использую имена файлов для тестирования, соответствующие номеру SO, чтобы я мог вернуться к проблеме, если это необходимо. Следовательно, filename1 - это ваш успешно отсканированный список, filename2 - это аутентифицированный список, а выход - это разница.

Вы можете приложить весь второй оператор for в скобках, чтобы перенаправить вывод в файл, если хотите, т.е.

... 
for .... 
) 
... 

становится

... 
(
for .... 
) 
)>somefilename 
... 

, чтобы перенаправить вывод somefilename

рутина работ первого удаления всех переменных окружения, которые начинаются с $ (обычно их нет, но убеждается)

Затем он проверяет второй файл, разбивая линию на %%a и %%b (два токена с каждой стороны разделителя «-») Если второй токен не существует, он устанавливает переменную окружения, например «$ 192.168.0.1». Если он существует, он повторно выражает «%% a. %% b» (примечание .) и назначает 1-4 и 8-й токен, поэтому «192.168.0.8-192.168.0.10» становится «192.168.0.8» и «192.168.0.8», 192.168.0.10" ; это горшок вместе как ". . . .192.168.0. " и маркеры 192,168,0,8 and 10 присваиваются %%p..%%t. Цикл for /l затем присваивает значение $192.168.0.8 до $192.168.0.10

Следующая аналогичная история, но на этот раз процедура просто проверяет, установлен ли переменная. Если он не установлен, то число равно echo ред.

+0

Я отредактировал мое сообщение, пожалуйста, дайте мне знать, если вы думаете, что ваш bat-файл все равно должен работать для моих нужд. Когда я запустил файл bat с образцами данных, которые я написал выше, он не дает ожидаемого результата. Я полагаю, потому что они сравнивают литеральные строки вместе. Когда дело доходит до IP-адресов, они иногда добавляют «-» между IP-адресами, чтобы сократить длину в программе, которую я использую. Есть ли способ, чтобы командный файл указывал, какое число отсутствует? – therealjsevilla

0
@echo off 
setlocal EnableDelayedExpansion 

set "d=" 
< input1.txt (
    for /F "tokens=1-4,8 delims=.-" %%a in (input2.txt) do (
     if "%%e" equ "" (set "n=%%d") else set "n=%%e" 
     for /L %%i in (%%d,1,!n!) do call :check %%a.%%b.%%c.%%i 
    ) 
) > result.txt 
goto :EOF 


:check 
    if not defined d (
     set "line=" 
     set /P "line=" 
     if not defined line exit /B 
     for /F "tokens=1-4,8 delims=.-" %%A in ("!line!") do (
     set "abc=%%A.%%B.%%C" 
     set "i=%%D" 
     set "d=%%E" 
    ) 
    ) else (
     set /A i+=1 
     if !i! equ !d! set "d=" 
    ) 
    if "%abc%.%i%" equ "%1" exit /B 
    echo %abc%.%i% 
goto check 

input1.txt файл является больше один (с 192.168.0.5 и 192.168.0.7 IP-адресов), а input2.txt короче один, без такого IP. Пример вывода:

192.168.0.5 
192.168.0.7 
192.168.0.11