Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Text-Begriff-Nummer in Datei suchen und bestimmte Zeile auslesen

Frage Entwicklung Batch & Shell

Mitglied: chgs2011

chgs2011 (Level 1) - Jetzt verbinden

14.11.2014 um 15:18 Uhr, 1186 Aufrufe, 13 Kommentare

Hallo,

ich suche eine Möglichkeit, eine Datei nach einem Text/Begriff/Nummer zu durchsuchen, um mir dann eine bestimme Zeile auslesen zu lassen.

Dateitypen sind unterschiedlich, können LOG, TXT, CACHE, ... sein, der Inhalt allerdings ist normaler Text.

Ich möchte dann nach Text "ABCDE" suchen, sofern vorhanden soll mir das Batch 17 Zeilen weiter oben diese Zeile auslesen.

Bislang habe ich folgendes realisiert, die Suche klappt und die gefundene Zeile wird ausgegeben:

01.
@echo off 
02.
:START 
03.
echo. 
04.
echo. ###################################### 
05.
echo. #                                    # 
06.
echo. #      Suche nach Text      # 
07.
echo. #                                    # 
08.
echo. ###################################### 
09.
echo. 
10.
echo Suche nach Text: 
11.
set /p wort=     
12.
echo. 
13.
find /i "%wort%" testfile.txt 
14.
echo. 
15.
echo. 
16.
GOTO START
Es ist vorab eine Teil-Lösung, anhand vom Suchergebnis, müsste ich in einer anderen Datei ebenfalls so weitersuchen und eine Zeile X auslesen.

Danke vorab.
Mitglied: rubberman
14.11.2014 um 16:17 Uhr
Hallo chgs2011.

Ich möchte dann nach Text "ABCDE" suchen, sofern vorhanden soll mir das Batch 17 Zeilen weiter oben diese Zeile auslesen.
01.
@echo off &setlocal 
02.
set "search=ABCDE" 
03.
set "file=testfile.txt" 
04.
 
05.
set "num=0" 
06.
for /f "delims=:" %%i in ('findstr /nic:"%search%" "%file%"') do set "num=%%i" 
07.
 
08.
if %num% equ 0 ( 
09.
  echo Suchzeichenfolge nicht gefunden. 
10.
  pause 
11.
  exit /b 
12.
13.
 
14.
 
15.
set /a "num -= 17" 
16.
 
17.
if %num% lss 1 ( 
18.
  echo Datei ist zu kurz. 
19.
  pause 
20.
  exit /b 
21.
22.
 
23.
set "line=" 
24.
<"%file%" ( 
25.
  for /l %%i in (2 1 %num%) do set /p "=" 
26.
  set /p "line=" 
27.
28.
 
29.
setlocal EnableDelayedExpansion 
30.
echo(!line! 
31.
endlocal 
32.
 
33.
pause
Es ist vorab eine Teil-Lösung, anhand vom Suchergebnis, müsste ich in einer anderen Datei ebenfalls so weitersuchen und eine Zeile X auslesen.
Ich verstehe kein Wort.

Grüße
rubberman
Bitte warten ..
Mitglied: chgs2011
17.11.2014 um 07:57 Uhr
Danke rubberman, der Ansatz sieht super aus und klappt für einzelne Files!

Ich würde das gerne aber auf mehrere Dateien zeitgleich nutzen, am liebstens würde ich alle Dateien in einem Order Y mit X Unterordner durchsuchen.

Ginge das generell?
Bitte warten ..
Mitglied: rubberman
17.11.2014 um 12:07 Uhr
Hallo chgs2011.

Klar geht das (FOR /R, FOR /F mit DIR /S oder FINDSTR /S). Du musst nur ein paar Infos rausrücken.
  • Bleibt die Suchzeichenfolge für alle Dateien gleich?
  • Was soll mit den gefundenen Werten passieren? (Bildschirmausgabe, in eine andere Datei schreiben, irgendwo weiterverarbeiten ...)
  • Musst du irgend eine Verbindung zu der Datei haben, in der die Suchzeichenfolge gefunden wurde?

Niemand kennt das endgültige Ziel der Aktion, außer du selbst ...

Grüße
rubberman
Bitte warten ..
Mitglied: chgs2011
17.11.2014 um 12:53 Uhr
Ich muss in X Verzeichnissen verschiedene Dateitypen durchsuchen.

Die Struktur ist bislang gleich, habe diese verglichen.

Ich muss lediglich in einer Datei Zeile 10+17 davor ausgeben, das reicht mir vollkommen aus.
Bitte warten ..
Mitglied: rubberman
17.11.2014, aktualisiert um 16:34 Uhr
Hallo chgs2011.

Du hast zwar meine Fragen nicht beantwortet und was nun
in einer Datei Zeile 10+17 davor ausgeben
bedeuten soll ist mir schon wieder gänzlich unklar, aber naja ... dann musst du halt mit dem Vorlieb nehmen, was ich verstanden habe.
01.
@echo off &setlocal DisableDelayedExpansion 
02.
 
03.
set "base=C:\Pfad zu\deinen Dateien" 
04.
set "ext=*.txt *.log *.cache" 
05.
set "search=ABCDE" 
06.
 
07.
pushd "%base%" 
08.
for /f "delims=" %%f in ('dir /a-d /b %ext%') do ( 
09.
  set "file=%%f" 
10.
  call :proc 
11.
12.
popd 
13.
 
14.
pause 
15.
exit /b 
16.
 
17.
 
18.
:proc 
19.
set "num=0" 
20.
for /f "delims=:" %%i in ('findstr /nic:"%search%" "%file%"') do set "num=%%i" 
21.
if %num% equ 0 exit /b 
22.
 
23.
set /a "num -= 17" 
24.
if %num% lss 1 exit /b 
25.
 
26.
set "line=" 
27.
<"%file%" ( 
28.
  for /l %%i in (2 1 %num%) do set /p "=" 
29.
  set /p "line=" 
30.
31.
 
32.
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
33.
echo   Datei: "%file%" 
34.
setlocal EnableDelayedExpansion 
35.
echo(!line! 
36.
endlocal 
37.
exit /b
Grüße
rubberman
Bitte warten ..
Mitglied: chgs2011
20.11.2014 um 10:55 Uhr
Danke für die Ausarbeitung, klappt soweit schon sehr gut

Nochmal zum Verständnis, ich möchte einen Textbaustein suchen, den ersten den er findet soll als Bezug dienen.
Von diesem Bezug aus (Zeile 37) soll er dann die Zeile 27 und 20 ausgeben.

Ich habe nun eben festgestellt, dass ich auch Sonderzeichen habe, meine Suche dadurch natürlich nicht klappt.

Suchtext z.B.: <key>order:</key>

Habe es so versucht: ^<key^>order:^</key^>

Aber das will nicht so recht.

Vielen Dank bis dahin!
Bitte warten ..
Mitglied: rubberman
20.11.2014, aktualisiert um 16:26 Uhr
Wenn es sich um XML handeln sollte, ist Batch der falsche Ansatz! Hier hangelt man sich durch das DOM und arbeitet mit Node-Objekten. Somit gibt es auch keine Probleme damit in welcher Zeile nun was zu finden ist, da es für XML sowieso egal ist ob der gesamte Inhalt in einer Zeile oder in 1000 steht. Das nächste Problem ist dass XML wahrscheinlich UTF-8 codiert vorliegt, Batch arbeitet mit ASCII. Etc.

Ich habe langsam keine Ahnung mehr, wie man dir helfen könnte, denn deine Aussage "der Inhalt allerdings ist normaler Text" ist schlicht falsch und Informationen fließen häppchenweise auf Anfrage (wenn überhaupt). Entweder du postest einen kompletten Beispielinhalt deiner Dateien mit Erklärung was genau du darin benötigst, oder ich klinke mich an dieser Stelle aus.

Grüße
rubberman
Bitte warten ..
Mitglied: chgs2011
20.11.2014 um 17:02 Uhr
Danke rubberman, es sind aber leider keine XML-Files, es sind diverse Datenbank-Files eines PDM-Systems.

Diese Dateiendungen werden zudem indexiert und können heißen:
xxxxx.log.1
xxxxx.log.2
xxxxx.log.3
xxxxx.cache.1
xxxxx.cache.2
xxxxx.cache.3


Den Inhalt kann ich aus verschiedenen Gründen nicht ohne weiteres zur Verfügung stellen, sonst hätte ich dies schon getan.

Wie bereits erwähnt klappt soweit die Suche, wenn ich starr nach den Werten suche.
Ich wollte die Suche aber genauer Eingrenzen, eben mit derartigen "Tags" in der Datei, da die gesuchen Werte mehrmals vorkommen.


Beispiel:

Suchbegriff XXX
<id>order: XXX</id>
<key>order: XXX</key>


Wenn ich dann Zeile 10 und 17 davor auslesen muss, ist es wichtig den richtigen Zeilen-Startpunkt zu finden,
daher wollte ich nun den ganzen String suchen:

<key>order: XXX</key>


Mir würde auch ein Platzhalter ausreichen wie:

*key*order*XXX*key*



Sorry für die Umstände, bin leider auch etwas gefesselt.
Bislang bekomme ich halt mit dem Script zuviele Zeilen ausgegeben, die man aber auch manuell von Hand filtern kann.
Bitte warten ..
Mitglied: rubberman
20.11.2014 um 18:19 Uhr
In dem Fall habe ich keine Ahnung warum es nicht funktionieren soll. Mit deinen Beispielstrings habe ich bei meinem oben geposteten Code nicht die geringsten Probleme. Aber auch wie die Umsetzung in deinem eigenen Code aussieht, ist ohne Glaskugel nicht zu erahnen.

es sind aber leider keine XML-Files
Woran machst du das fest? Dass sie eine andere Dateiendung als *.xml haben?

Den Inhalt kann ich aus verschiedenen Gründen nicht ohne weiteres zur Verfügung stellen, sonst hätte ich dies schon getan.
Nonsens. Sensible Daten lassen sich mit jedem x-beliebigen Texteditor entsprechend verfälschen, bevor man den Inhalt postet.

Grüße
rubberman
Bitte warten ..
Mitglied: chgs2011
21.11.2014 um 10:55 Uhr
Ich versuche es zunächst mal so.

Nur eine letzte Frage, der Suchbegriff wird gesucht, er sucht in der Datei aber immer nur die letzte und gibt diese aus.

Was ist mit den Suchergebnissen, die zuvor mehrmals gefunden wurden? Woran liegt das?
Bitte warten ..
Mitglied: rubberman
21.11.2014 um 12:27 Uhr
Liegt an der Schleife in Zeile 20. Die Variable num wird so oft überschrieben, wie die Suchzeichenfolge gefunden wird. Mit dem letzten Wert wird weiter gearbeitet.
Wenn du mehrere Suchergebnisse hast, ist die ganze Sache nicht eindeutig und du hast sowieso ein grundsätzliches Problem. Du musst also schon dafür sorgen, dass deine Suchzeichenfolge auch eindeutig ist.

Grüße
rubberman
Bitte warten ..
Mitglied: chgs2011
27.11.2014 um 16:34 Uhr
So, habe nun paar Tage bissel versucht und analysiert, leider komme ich nicht 100% auf brauchbare Ausgaben.

Ich musste leider feststellen, dass die Datenbank so komplexe Cache-Files erzeugt, dass nicht einmal die Struktur einheitlich ist.

Allerdings habe ich einen anderen Lösungsansatz gefunden, den ich versuche umzusetzen.

Ich danke dir vielmals für die Beispiele, sind bei mir im Archiv, da ich das auf jeden Fall wieder mal brauchen werde!!!

Ich hoffe ich kann auf deine Unterstützung zählen, beim neuen Lösungsansatz?



Lösungsansatz:
Ich möchte nun alle Dateien mit Endung ".lid" in einem Ordner auf Inhalt durchsuchen.
Hierzu möchte ich einen Suchbegriff in Zeile 10 abfragen.
Sollte der Suchbegriff in Zeile 10 vorhanden sein, soll diese Datei kopiert und in einen Unterordner "backup" gelegt werden.

An sich sollte das relativ simpel sein, oder?

Vielen Dank vorab.
Bitte warten ..
Mitglied: rubberman
29.11.2014 um 14:31 Uhr
den ich versuche umzusetzen.
Öhm, dann würde ich das nächste mal gerne deinen noch nicht funktionierenden Versuch sehen.
An sich sollte das relativ simpel sein, oder?
Dann verstehe ich nicht warum du ... ach egal

ungetestet:
01.
@echo off &setlocal DisableDelayedExpansion 
02.
 
03.
set "base=C:\Pfad zu\deinen Dateien" 
04.
set "ext=*.lid" 
05.
set "search=ABCDE" 
06.
 
07.
pushd "%base%" 
08.
2>nul md "backup" 
09.
for /f "delims=" %%f in ('dir /a-d /b %ext%') do ( 
10.
  set "file=%%f" 
11.
  call :proc 
12.
13.
popd 
14.
 
15.
pause 
16.
exit /b 
17.
 
18.
 
19.
:proc 
20.
for /f "delims=:" %%i in ('findstr /nic:"%search%" "%file%"') do if %%i equ 10 ( 
21.
  echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
22.
  echo   Datei: "%file%" 
23.
  copy "%file%" "backup\" 
24.
25.
exit /b
Grüße
rubberman
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (12)

Frage von Motte990 zum Thema Microsoft Office ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...