Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

bei vielen Dateien nur die auflisten, wo Zeile 2 nicht einen bestimmten String enthaelt?

4 views
Skip to first unread message

Astrid

unread,
Oct 10, 2022, 4:46:21 AM10/10/22
to
Hallo!

Habe in einem Verzeichnis viele Dateien.
Nun moechte ich alle Dateinamen auflisten, wo Zeile 2 nicht diesen
String enthaelt:

| _ _ _ ___ ___ _ __ __ |

Kann man das irgendwie bashmaessig abfragen?

Danke.

Gruss, Astrid

Jan Novak

unread,
Oct 10, 2022, 9:03:27 AM10/10/22
to
Am 10.10.22 um 10:46 schrieb Astrid:
> Hallo!
>
> Habe in einem Verzeichnis viele Dateien.
> Nun moechte ich alle Dateinamen auflisten, wo Zeile 2 nicht diesen
> String enthaelt:
>
> | _ _ _ ___ ___ _ __ __ |
>
> Kann man das irgendwie bashmaessig abfragen?

Ganz sicher.
Ich kann dir jetzt zwar keine Lösung nennen, aber die Vorgehensweise wäre ja

Schleife, in welcher alle Dateien des Typs, die du durchsuchen möchstes
durchgegangen wird.
Dann ein "haed -n2|tail -n1" auf die Datei und entsprechend verfahren.

Jan

Alex Bochannek

unread,
Oct 10, 2022, 2:48:53 PM10/10/22
to
Astrid <astri...@gmail.com> writes:

> Hallo!

Hallo!

> Habe in einem Verzeichnis viele Dateien.
> Nun moechte ich alle Dateinamen auflisten, wo Zeile 2 nicht diesen
> String enthaelt:
>
> | _ _ _ ___ ___ _ __ __ |
>
> Kann man das irgendwie bashmaessig abfragen?

Zuerst würde ich das Muster in einer Variablen verpacken:

pat="| _ _ _ ___ ___ _ __ __ |"

Dann wäre die nächste Frage, ob man nach den Dateien suchen muss, oder
ob die alle in einem Verzeichnis liegen. Im ersten Fall, ist ein * durch
ein $(find . -type f) oder Ähnliches zu ersetzen.

Ist dieses Muster wirklich sonst noch irgendwo in den Dateien? D.h.,
muss man wirklich nur nach Zeile 2 suchen? Falls nicht, reicht einfach:

grep -Lx "${pat}" *

Wie sehr bashmässig muss es denn sein? Ist sed/awk erlaubt? Wenn ja,
geht das ganz einfach mit awk:

for file in *; do
awk -v pat="${pat}" 'NR == 2 && $0 != pat {print FILENAME}' "$file"
done

Sind externe Programme allerdings nicht erlaubt, dann kann man das in
etwa so machen:

for file in *; do
i=0
while read -r line; do
(( i++ ))
if [[ i -eq 1 ]]; then
continue
fi
if [[ i -eq 2 && "${line}" != "${pat}" ]]; then
echo "${file}"
fi
continue 2
done < "${file}"
done

Hoffe, das hilft!

--
Alex.

Thomas Dorner

unread,
Oct 10, 2022, 3:08:03 PM10/10/22
to
Jan Novak <rep...@gmail.com> writes:
> Am 10.10.22 um 10:46 schrieb Astrid:
Oder mit sed:

Alle Deteien, die $REGEXP in Zeile 2 enthalten:

for f in *; do sed -ne "2s/.*$REGEXP.*/$f/p" "$f"; done

Alle Deteien, die $REGEXP in Zeile 2 nicht enthalten:

for f in *; do [[ -z $(sed -ne "2s/.*$REGEXP.*/$f/p" "$f") ]] && echo "$f"; done

Viele Grüße, Thomas
--
Adresse gilt nur kurzzeitig!

Volker Englisch

unread,
Oct 10, 2022, 4:33:07 PM10/10/22
to
Astrid schrieb am 10.10.2022:
> Hallo!
>
> Habe in einem Verzeichnis viele Dateien.
> Nun moechte ich alle Dateinamen auflisten, wo Zeile 2 nicht diesen
> String enthaelt:
>
>| _ _ _ ___ ___ _ __ __ |
>
> Kann man das irgendwie bashmaessig abfragen?

Schnellschuss:

for d in * ; do head -2 "$d" | tail -1 | grep -v "Deinstring"
>/dev/null && echo "$d" ; done

Wenn der String in einem File steckt, dann statt "Deinstring" `cat
$file` stattdessen.

Helmut Waitzmann

unread,
Oct 10, 2022, 5:58:25 PM10/10/22
to
Astrid <astri...@gmail.com>:
>
> Habe in einem Verzeichnis viele Dateien.
>
> Nun moechte ich alle Dateinamen auflisten, wo Zeile 2 nicht
> diesen String enthaelt:
>
> | _ _ _ ___ ___ _ __ __ |
>

Wie möchtest du den Fall, dass die Datei keine zweite Zeile hat,
gewertet wissen?

Was verstehst du unter «enthalten»?  Enthält beispielsweise die
Datei mit dem Inhalt (Zitat aus
<http://www.dasbergwerk.de/Niederer_Unfug/Struwelpeter.html>)

Konrad sprach zur Frau Mama:
"Ich geh fort und Du bleibst da.
Sei hübsch ordentlich und fromm,
ich bin nur kurz in Spielsalon.
Und vor allem hör mir zu,
laß den Video in Ruh.
Die Brutalos sind vom schärfsten,
das ist nix für Deine Nerven."

in der zweiten Zeile die Zeichenkette «bleib»?


> Kann man das irgendwie bashmaessig abfragen?
>

Kommt darauf an, was du unter «bashmaessig» verstehst.  Ich
interpretiere das mal so:  «Kann man eine ‹bash›‐Kommandozeile
schreiben, die die Namen aller Dateien in einem Verzeichnis, bei
denen in der zweiten Zeile die gegebene Zeichenkette nicht
gefunden werden kann, durch je einen Zeilenwechsel getrennt
ausgibt, wenn man sich dabei auf die in den «bash» eingebauten
Kommandos beschränken will?»

(
verzeichnis='Setz hier das passende ein!' &&
# (Nur, damit keine so lange Zeile hinzuschreiben ist,
# was im Usenet nicht so gerne gesehen wird:)
suchbegriff='| _ _ ' &&
suchbegriff="$suchbegriff"' _ ___ __' &&
suchbegriff="$suchbegriff"'_ _ __ __ |' &&
: "${verzeichnis:?}" &&
for dateiname in "${verzeichnis%/}/"* \
"${verzeichnis%/}/".[!.]* "${verzeichnis%/}/"..?*
do
if test -f "$dateiname" &&
{
IFS= read -r -- zeile &&
IFS= read -r -- zeile &&
case "$zeile" in
(*"$suchbegriff"*) ! :
;;
(*) :
;;
esac
} < "$dateiname"
then
printf '%s\n' "$dateiname"
fi
done
)

Diese Kommandozeile enthält nur Elemente, die in den «bash»
eingebaut sind («test» und «printf» gehören auch dazu).
Message has been deleted

Astrid

unread,
Oct 11, 2022, 5:43:08 AM10/11/22
to
Hallo zusammen,

danke Euch fuer die Beispiele. :)
Der String kommt wenn, dann nur einmal vor.
Und es sollte auch ueberall mehr als 2 Zeilen geben.

Und z.B. mit

for f in *; do sed -ne "2s/.*$PAT.*/$f/p" "$f"; done

rekursiv auch durch vorhandene Unterverzeichnisse?

Gruss, Astrid

Alex Bochannek

unread,
Oct 11, 2022, 2:34:02 PM10/11/22
to
Astrid <astri...@gmail.com> writes:

> Hallo zusammen,
>
> danke Euch fuer die Beispiele. :)
> Der String kommt wenn, dann nur einmal vor.

Das macht das einfacher! Der grep Befehl hat da die -L Option, die
Dateinamen ausgibt, in denen das Muster nicht gefunden wurde.

> rekursiv auch durch vorhandene Unterverzeichnisse?

Dafür gibt es dann -R bei grep.

Also:

grep -RLx "${pat}" *

--
Alex.

Michael Schütz

unread,
Oct 11, 2022, 3:44:04 PM10/11/22
to
Alex Bochannek <al...@bochannek.com> schrieb:
Und wenn der String nun in der dritten Zeile steht?

--
Die Fantasie des Mannes ist die beste Waffe der Frau.
Sophia Loren

Alex Bochannek

unread,
Oct 11, 2022, 4:50:20 PM10/11/22
to
Michael Schütz <der.sc...@web.de> writes:

> Alex Bochannek <al...@bochannek.com> schrieb:
>
>>
>> grep -RLx "${pat}" *
>>
> Und wenn der String nun in der dritten Zeile steht?

Da habe ich dann Astrids Erläuterung falsch interpretiert. Ich habe
"kommt nur einmal" als "kommt nur einmal und wenn, dann in der zweiten
Zeile" gelesen.

Ich bleibe bei meiner awk-Lösung:

find . -type f -exec awk -v pat="${pat}" 'NR == 2 && $0 != pat {print FILENAME}' {} \;

--
Alex.
0 new messages