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

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

vngreez@vk 21-06-2017 20:53 2746531

findstr точный поиск
 
Вложений: 1
имееться файл file.txt, вот его содержимое:
============
/system/bin/mtkmal u: object_r:mtkmal_exec:s0
/system/bin/wifi2agps u: object_r:wifi2agps_exec:s0
/system/bin/wmt_loader u: object_r:wmt_loader_exec:s0
/system/bin/xlog u: object_r:xlog_exec:s0
/system/bin/sbchk u: object_r:sbchk_exec:s0
/system/bin/OperaMaxSystem u: object_r:tunman_exec:s0
/system/etc/sensor u: object_r:system_sensor_data_file:s0
/system/vendor/bin/pvrsrvctl u: object_r:pvrsrvctl_exec:s0
/system/xbin/BGW u: object_r:BGW_exec:s0
/system/xbin/mnld u: object_r:mnld_exec:s0
/system/bin/md_ctrl u: object_r:md_ctrl_exec:s0
/system/bin/cmddumper u: object_r:cmddumper_exec:s0
============
findstr "^/system/etc\>" file.txt
Данная команда должна найти текст /system/etc.
Файл 146383
Она работает некорректно, вместо указанного выше текста, находиться /system/etc/sensor u: object_r:system_sensor_data_file:s0

Как это исправить?
(где: u: object_r:... пробелов не должно быть, поставил из-за того что появляется смайл )

Iska 21-06-2017 21:30 2746536

Цитата:

Цитата vngreez@vk
имееться файл file.txt, вот его содержимое: »

Упакуйте файл file.txt в архив и приложите к сообщению, либо выложите архив на RGHost или Яндекс.Диск.

Цитата:

Цитата vngreez@vk
(где: u: object_r:... пробелов не должно быть, поставил из-за того что появляется смайл ) »

Обрамили бы тэгом code — не появился бы. Либо установили бы флажок «Разное: Отключить смайлики в тексте» справа от поля ввода.

greg zakharov 21-06-2017 21:31 2746537

Сейчас придет Iska и посоветует использовать ключ /l.Со своей же стороны:
Код:

findstr /rc:"^/system/etc$" file.txt

vngreez@vk 21-06-2017 21:49 2746538

Вложений: 1
Iska,

vngreez@vk 21-06-2017 21:51 2746539

greg zakharov, не получилось

greg zakharov 21-06-2017 22:12 2746546

Вы всерьез полагаете, что findstr работает как grep? fiindstr не умеет извлекать регуляркой подстроки в строке.
Наберите в самой командной строке:
Код:

cmd /v/c "(for /f "tokens=1" %i in ('findstr /rc:""^/system/etc"" file.txt') do @set i=%i)&echo !i:~0,11!"
И будет Вам счастье.

Iska 21-06-2017 23:20 2746560

Вопрос только — зачем извлекать из строки то, что и так известно?

vngreez@vk 21-06-2017 23:40 2746564

Iska, greg zakharov, в моем коде присутствует цикл (for /f) и вместо /system/etc (я использую этот вариант в качестве примера) может быть любое значения. Но из-за этого не хочет нормальна работать код.
Вместо system/etc может найтись любый значения: /system/etc/sensor, /system/etc/lib.... Хотя я так не задумывал
Может есть все таки способ?

Iska 22-06-2017 00:53 2746574

vngreez@vk, пока я так и не понял, что именно Вы хотите найти, и что получить в результате.

greg zakharov 22-06-2017 07:41 2746584

Цитата:

Цитата Iska
Вопрос только — зачем извлекать из строки то, что и так известно?

Каков ТЗ, таков ХЗ.

Цитата:

Цитата vngreez@vk
в моем коде присутствует цикл (for /f)

Солидарен с Iska, ибо уже без бутылки здесь похоже уже не разобраться. Почему просто не привести свой код, объяснить что Вы хотите добиться, словом, четко сформулировать свои мысли, ммм?! Четко сформулированная задача - половина решения последней.

vngreez@vk 22-06-2017 11:35 2746606

Iska, greg zakharov, Мне нужен точный поиск слова в тексте, вот и вся задача.
greg zakharov, извлекать строку по подстроке мне не нужно

alpap 22-06-2017 12:00 2746610

Цитата:

Цитата vngreez@vk
Вместо system/etc может найтись любый значения: /system/etc/sensor, /system/etc/lib.... Хотя я так не задумывал »

давайте по полочкам

если у вас задача найти в тексте именно "/system/etc", хотя такой строки там сейчас и нет, то сделать это просто, но сразу напрашивается вопрос
Цитата:

Цитата Iska
Вопрос только — зачем извлекать из строки то, что и так известно? »

, в данном случае искать
естественно и с учетом того что в тексте есть строка СОДЕРЖАЩАЯ в себе "/system/etc" вам стали предлагать решения по поиску таких строк и уже с учетом ваших желаний еще и извлекать эту часть из строки, но и это не то, начинаем телепатировать

вариант1
в тексте есть несколько строк, содержащих "/system/etc" и только одна строка чисто "/system/etc" и ее надо найти

вариант2
в тексте есть несколько строк, содержащих "/system/etc", но строк именно "/system/etc", например несколько, найти первую встретившуюся или последнюю или определенную по счету

посмотрим что вы ответите

Iska 22-06-2017 12:04 2746612

Цитата:

Цитата vngreez@vk
Мне нужен точный поиск слова в тексте, вот и вся задача. »

Это не задача. Это выбранное Вами решение для неизвестной нам задачи. Например, это:
Код:

type file.txt | findstr.exe /l /c:"/system/etc"
(прав был коллега greg zakharov, ой, прав — таки «/l» ;)) — находит эту подстроку. Если Вас интересует совпадение только со всей строкой в целом, а не с любой её частью — тогда указанное коллегой greg zakharov выше:
Код:

type file.txt | findstr.exe /r /c:"^/system/etc$"
и в том, и в другом случае по коду возврата мы можем сделать вывод об успешности поиска.

megaloman 22-06-2017 14:25 2746649

vngreez@vk,
Цитата:

Цитата Операция Ы и другие приключения Шурика
Огласите весь список, пожалуйста!

Iska, У меня зародилось подозрение, что задача стоИт так:
Есть файл со строками вида "строка1 строка2"
Надо определить, есть ли в файле строка, где "строка1" имеет определённый вид.
Если это так, то решение Iska примет вид:
Код:

type file.txt | findstr.exe /l /N /c:"/system/etc "
Всего-то пробел добавить в конце искомой подстроки.

vngreez@vk 22-06-2017 14:29 2746650

Iska, В первом примере снова находиться другая строка, во втором она не работает, потому что текст не закачивается, а присутствует еще текст:
/system/vendor/bin/pvrsrvctl u: object_r:pvrsrvctl_exec:s0
alpap, Нужен именно первый вариант

Iska 22-06-2017 14:34 2746656

Цитата:

Цитата vngreez@vk
Iska, В первом примере снова находиться другая строка, »

  1. Какая находится?
  2. Какая должна по Вашему мнению находиться?

И, может быть, Вы таки озвучите Вашу задачу? Повторяю: не выбранное Вами решение, а задачу. Ибо, если как минимум пять человек не могут толком понять, чего Вы хотите — значит, явно что-то не так.

x0r 22-06-2017 15:57 2746673

Код:

=>grep -o "/system/etc" file.txt
/system/etc

он хочет ;-)
Ну дык и возьми grep для этого. findstr этого вродеб не умеет.

greg zakharov 22-06-2017 16:06 2746674

x0r, да хоть perl'ом:
Код:

$ perl -ne "print $1 if /^(\/system\/etc)/" file.txt
/system/etc

Уже писал несколькими постами ранее, что findstr - не grep (и уж тем более не perl).

Iska 22-06-2017 16:22 2746675

x0r — это шесть! ;)

x0r 22-06-2017 17:15 2746686

greg zakharov, ага, есть такое. я пропустил. :cool:
Хотя и действительно неясно: зачем искать только то, что и так известно - найти "/system/etc" чтоб взять "/system/etc" ... Можнож сразу взять /system/etc (в переменную) и ничего нигде не искать.

Может тебе это надо:
Код:

>findstr /X "^/system/etc" file.txt
содержание файла file.txt
Код:

/system/bin/mtkmal u: object_r:mtkmal_exec:s0
/system/bin/wifi2agps u: object_r:wifi2agps_exec:s0
/system/bin/wmt_loader u: object_r:wmt_loader_exec:s0
/system/etc
/system/bin/xlog u: object_r:xlog_exec:s0
/system/bin/sbchk u: object_r:sbchk_exec:s0
/system/bin/OperaMaxSystem u: object_r:tunman_exec:s0
/system/etc/sensor u: object_r:system_sensor_data_file:s0
/system/vendor/bin/pvrsrvctl u: object_r:pvrsrvctl_exec:s0
/system/xbin/BGW u: object_r:BGW_exec:s0
/system/xbin/mnld u: object_r:mnld_exec:s0
/system/bin/md_ctrl u: object_r:md_ctrl_exec:s0
/system/bin/cmddumper u: object_r:cmddumper_exec:s0


vngreez@vk 22-06-2017 17:37 2746689

вместо /system/etc будет стоять %%a (цикл из другого файла). В зависимости от того найдено ли слово, будет выполняться условие
ФУх.. Ну так хоть объяснил?
Желательно использовать bat команды чтобы получить код возврата ошибки

x0r, Iska, greg zakharov, Весь геморой в том, что должен быть ТОЧНЫЙ поиск
возьму другой пример: /system/app
Его необходимо найти, но вместо него найдется всякий хлам:
/system/app/тырыпыры
/system/app/lib
и тд.
А мне нужной найти что я написал /system/app, он может быть и не быть записан в файл

greg zakharov 22-06-2017 17:53 2746694

Вам уже указали на точный поиск. Вам нужно:
1) узнать есть ли строка /system/etc в файле
2) в строке после обозначенных выше символов больше ничего не встречается, т.е. /system/etc или /system/app и все, - далее прочие строки
3) если строки /system/etc нет, вернуть некий код ошибки
Так? Или предпочтете воспользовоться звонком другу не так?

vngreez@vk 22-06-2017 18:02 2746695

greg zakharov, 2) встречаеться /system/etc/sensor u: object_r:system_sensor_data_file:s0
жирным выделил

greg zakharov 22-06-2017 18:07 2746698

Iska, надеюсь Вы не будете против, если я пополню Ваш клуб случайно облысевших?

vngreez@vk, пардон, но искать тогда что и что в данном случае может быть "точным поиском"? Вам нужно еще "хвост" в этой строке захватить регулярным выражением?

vngreez@vk 22-06-2017 18:21 2746701

greg zakharov, да

greg zakharov 22-06-2017 18:38 2746703

То есть, допустим, файл:
Код:

...
/system/bin/vtservice u:object_r:vtservice_exec:s0
/system/bin/hotknot_native_service u:object_r:hotknot_native_exec:s0
/system/bin/teei_daemon u:object_r:teei_daemon_exec:s0
/system/bin/init_thh u:object_r:init_thh_service_exec:s0
/system/etc u:object_r:system_sensor_data_file:s0
/system/bin/md_monitor u:object_r:md_monitor_exec:s0
/system/bin/mvg_spoh u:object_r:mvg_spoh_exec:s0
/system/bin/fpserver u:object_r:fpserver_exec:s0
/system/app u:object_r:system_sensor_data_file:s0
...

Тогда:
Код:

@echo off
  setlocal enabledelayedexpansion
    set "re=/system/# u:object_r:system_sensor_data_file:s0"
    for %%i in (etc app) do (
      >nul findstr /l /c:"!re:#=%%i!" file.txt&&echo:%%i found
    )
  endlocal
exit /b

Так?

x0r 22-06-2017 18:42 2746704

фигня кокая-то... может это багоглюк в традициях M$ :search:
file.txt :
Код:

/system/bin/mtkmal u: object_r:mtkmal_exec:s0
/system/bin/wifi2agps u: object_r:wifi2agps_exec:s0
/system/bin/wmt_loader u: object_r:wmt_loader_exec:s0
/system/etc
/system/bin/xlog u: object_r:xlog_exec:s0
/system/bin/sbchk u: object_r:sbchk_exec:s0
/system/bin/OperaMaxSystem u: object_r:tunman_exec:s0
/system/etc/sensor u: object_r:system_sensor_data_file:s0
/system/vendor/bin/pvrsrvctl u: object_r:pvrsrvctl_exec:s0
/system/xbin/BGW u: object_r:BGW_exec:s0
/system/xbin/mnld u: object_r:mnld_exec:s0
/system/bin/md_ctrl u: object_r:md_ctrl_exec:s0
/system/bin/cmddumper u: object_r:cmddumper_exec:s0
/system/app/qweee
/system/app/lib
/system/app/qewqeqwe
/system/app

1 если искать /system/etc
Код:

findstr /X /C:"/system/etc" file.txt
/system/etc

т.е. находит.

2 если искать /system/app
Код:

findstr /X /C:"/system/app" file.txt
т.е. ненаходит нифига ?:

3 если сделать через type или sort
Код:

type file.txt | findstr /X /C:"/system/app"
/system/app

sort file.txt | findstr /X /C:"/system/app"
/system/app

sort file.txt | findstr /X /C:"/system/etc"
/system/etc

то находит всегда. Это чего, дело в алфавите, в порядке расположения строк для findstr чтоле?!

x0r 22-06-2017 19:11 2746714

upd: дошло. дело в том, что это последняя строка и там EOF. мдаааа... так что всё равно, это считай баг опции findstr /X : если искомое выражение стоит последним в файле, то не будет найдено.

megaloman 22-06-2017 19:20 2746716

vngreez@vk, строка вида
/system/etc тырыпыры
должна быть найдена, или она ошибочная? Тогда почему?

Iska 22-06-2017 19:23 2746717

Цитата:

Цитата greg zakharov
Iska, надеюсь Вы не будете против, если я пополню Ваш клуб случайно облысевших? »

Легко! :)

Цитата:

Вся королевская конница,
Вся королевская рать…

greg zakharov 22-06-2017 19:39 2746720

Цитата:

Цитата Iska
Вся королевская конница,
Вся королевская рать…

Не может Шайтана, не может Болтая,
Шайтана-Болтая собрать...

Iska 22-06-2017 20:30 2746728

В данном случае — не Болтая.

megaloman 22-06-2017 21:18 2746741

vngreez@vk, Что здесь не так?
Код:

@Echo Off
Cls

Set "FileIn=Z:\Box_Arc\file\file.txt"
Set "Spisok=/system/etc /system/app /system/bin"

FOR %%f IN (%Spisok%) DO More "%FileIn%" | findstr.exe /l /N /c:"%%~f "

pause


vngreez@vk 23-06-2017 13:01 2746856

x0r, megaloman, Iska, greg zakharov, шутки шутками, я вот не могу понять что тут сложного: найти слово точно.
Вообщем сам нашел решение и сделал вот так:
Код:

set "fixFileContext=file.tx"
set "sysFiles=sorerzimoe.txt"

for /F "usebackq tokens=1-5 delims= " %%a in ("%sysFiles%") do (
        findstr /B "^/%%a\>" %fixFileContext% && (
                for /f %%f in ('find "%%a" %fixFileContext%') do (
                        if "%%a"=="%%f" (  код...

Всем спасибо за помощь
и пополнения словаря шутак

alpap 23-06-2017 22:50 2746921

vngreez@vk,
ну да, ну да

если в file.txt (неправильно расширение в коде - опечатка) строка /system/etc,
а в sorerzimoe.txt то что в шапке темы (имееться файл file.txt, вот его содержимое)

то даже это уже не работает, что говорит о том что свой код вы даже не запускали ни разу
и зачем остальные четыре токена?
Код:

@echo on
set "fixFileContext=file.txt" &: Здесь опечатка в расширении была
set "sysFiles=sorerzimoe.txt"

:: Дальше темный лес, уже это не работает
for /F "usebackq tokens=1-5 delims= " %%a in ("%sysFiles%") do findstr /B "^/%%a\>" %fixFileContext%
pause

если поменять содержимое текстовиков наоборот
в file.txt как в шапке, а в sorerzimoe.txt строка "/system/etc /system/app /system/bin"
то точно также не работает

покажите содержимое обоих файлов, полный код и скриншот окна cmd где видно что найдено то что нужно.

кстати
Цитата:

Цитата vngreez@vk
и пополнения словаря шутак »

относится к вашему второму for

например file.txt содержит строку: slovo
вот аналог второго for
Код:

@echo off
set "a=slovo"
for /f %%f in ('find "%a%" file.txt') do if "%a%"=="%%f" echo %a% естественно равно %%f
pause



Время: 20:50.

Время: 20:50.
© OSzone.net 2001-