{
"cells": [
{
"cell_type": "markdown",
"id": "27e92a25",
"metadata": {},
"source": [
"# `grep` und `find`"
]
},
{
"cell_type": "markdown",
"id": "970d7eb8",
"metadata": {},
"source": [
"## `grep`\n",
"\n",
"`grep` findet Zeilen in Dateien, die einem [regulären Ausdruck](https://python-basics-tutorial.readthedocs.io/de/latest/appendix/regex.html) entsprechen. Im folgenden Beispiel wird nach der Zeichenkette `Python` gesucht:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "acdeb97b",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"IPython\n",
"`IPython `_ oder *Interactive Python* war zunächst ein\n",
"erweiterter Python-Interpreter, der nun zu einem umfangreichen Projekt geworden\n",
"bereitstellen soll. So ist IPython heute nicht nur eine interaktive\n",
"Schnittstelle zu Python, sondern bietet auch eine Reihe nützlicher syntaktischer\n",
"Ergänzungen für die Sprache. Darüberhinaus ist IPython eng mit dem\n",
" * `Miki Tebeka - IPython: The Productivity Booster\n"
]
}
],
"source": [
"!grep Python ../index.rst"
]
},
{
"cell_type": "markdown",
"id": "21f6002f",
"metadata": {},
"source": [
"Die Option `-w` begrenzt die Treffer auf die Wortgrenzen, so dass `IPython` ignoriert wird:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "1c528b24",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"`IPython `_ oder *Interactive Python* war zunächst ein\n",
"erweiterter Python-Interpreter, der nun zu einem umfangreichen Projekt geworden\n",
"Schnittstelle zu Python, sondern bietet auch eine Reihe nützlicher syntaktischer\n"
]
}
],
"source": [
"!grep -w Python ../index.rst"
]
},
{
"cell_type": "markdown",
"id": "c7e1c37c",
"metadata": {},
"source": [
"`-n` zeigt die Zeilennummern an, die übereinstimmen:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "10984ec4",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"8:`IPython `_ oder *Interactive Python* war zunächst ein\n",
"9:erweiterter Python-Interpreter, der nun zu einem umfangreichen Projekt geworden\n",
"12:Schnittstelle zu Python, sondern bietet auch eine Reihe nützlicher syntaktischer\n"
]
}
],
"source": [
"!grep -n -w Python ../index.rst"
]
},
{
"cell_type": "markdown",
"id": "b8b615de",
"metadata": {},
"source": [
"`-v` invertiert unsere Suche"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "c4c51cf8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1:.. SPDX-FileCopyrightText: 2020 cusy GmbH\n",
"2:..\n",
"3:.. SPDX-License-Identifier: BSD-3-Clause\n",
"4:\n",
"5:IPython\n",
"6:=======\n",
"7:\n",
"8:`IPython `_ oder *Interactive Python* war zunächst ein\n",
"9:erweiterter Python-Interpreter, der nun zu einem umfangreichen Projekt geworden\n",
"10:ist, das Tools für den gesamten Lebenszyklus der Forschungsdatenverarbeitung\n",
"11:bereitstellen soll. So ist IPython heute nicht nur eine interaktive\n",
"12:Schnittstelle zu Python, sondern bietet auch eine Reihe nützlicher syntaktischer\n",
"13:Ergänzungen für die Sprache. Darüberhinaus ist IPython eng mit dem\n",
"14:`Jupyter-Projekt `_ verbunden.\n",
"15:\n",
"16:.. seealso::\n",
"19:\n",
"20:.. toctree::\n",
"24:\n"
]
}
],
"source": [
"!grep -n -v \"^ \" ../index.rst"
]
},
{
"cell_type": "markdown",
"id": "713beb5e",
"metadata": {},
"source": [
"`grep` hat viele andere Optionen. Um herauszufinden, welche das sind, könnt ihr folgendes eingeben:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "8e777162",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"usage: grep [-abcdDEFGHhIiJLlMmnOopqRSsUVvwXxZz] [-A num] [-B num] [-C[num]]\n",
"\t[-e pattern] [-f file] [--binary-files=value] [--color=when]\n",
"\t[--context[=num]] [--directories=action] [--label] [--line-buffered]\n",
"\t[--null] [pattern] [file ...]\n"
]
}
],
"source": [
"!grep --help"
]
},
{
"cell_type": "markdown",
"id": "da80225f",
"metadata": {},
"source": [
"Im folgenden Beispiel verwenden wir die Option `-E` und setzen das Muster in Anführungszeichen, damit die Shell nicht versucht, es zu interpretieren. `^` im Muster verankert die Übereinstimmung am Anfang der Zeile und `.` entspricht einem einzelnen Zeichen."
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "5fdd8774",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"5:IPython\n"
]
}
],
"source": [
"!grep -n -E \"^.Python\" ../index.rst"
]
},
{
"cell_type": "markdown",
"id": "e7725494",
"metadata": {},
"source": [
"## `find`\n",
"\n",
"`find .` sucht in diesem Verzeichnis, wobei die Suche mit `-type d` auf Verzeichnisse beschränkt wird."
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "fb397457",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"..\n",
"../mypackage\n",
"../unix-shell\n",
"../unix-shell/.ipynb_checkpoints\n",
"../.ipynb_checkpoints\n"
]
}
],
"source": [
"!find .. -type d"
]
},
{
"cell_type": "markdown",
"id": "944f6319",
"metadata": {},
"source": [
"Mit `-type f` ist die Suche auf Dateien beschränkt."
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "2ee97ebc",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"./index.rst\n",
"./shell-variables.ipynb.license\n",
"./sorted-length.txt\n",
"./create-delete.ipynb\n",
"./grep-find.ipynb.license\n",
"./create-delete.ipynb.license\n",
"./length.txt\n",
"./dvc.list\n",
"./file-system.ipynb\n",
"./pipes-filters.ipynb\n",
"./shell-variables.ipynb\n",
"./pipes-filters.ipynb.license\n",
"./file-system.ipynb.license\n",
"./.ipynb_checkpoints/create-delete-checkpoint.ipynb\n",
"./.ipynb_checkpoints/grep-find-checkpoint.ipynb\n",
"./.ipynb_checkpoints/pipes-filters-checkpoint.ipynb\n",
"./.ipynb_checkpoints/file-system-checkpoint.ipynb\n",
"./grep-find.ipynb\n"
]
}
],
"source": [
"!find . -type f"
]
},
{
"cell_type": "markdown",
"id": "cf775d3d",
"metadata": {},
"source": [
"Mit `-mtime` wird die Suche auf die letzten `X` Tage beschränkt, in unserem Beispiel auf den letzten Tag:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "cda7229f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
".\n",
"./sorted-length.txt\n",
"./create-delete.ipynb\n",
"./length.txt\n",
"./dvc.list\n",
"./file-system.ipynb\n",
"./pipes-filters.ipynb\n",
"./.ipynb_checkpoints\n",
"./.ipynb_checkpoints/create-delete-checkpoint.ipynb\n",
"./.ipynb_checkpoints/pipes-filters-checkpoint.ipynb\n",
"./.ipynb_checkpoints/file-system-checkpoint.ipynb\n"
]
}
],
"source": [
"!find . -mtime -1"
]
},
{
"cell_type": "markdown",
"id": "4f9a7815",
"metadata": {},
"source": [
"Mit `-name` könnt ihr die Suche nach Dateinamen filtern."
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "0b449f37",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"../index.rst\n",
"../unix-shell/index.rst\n",
"../extensions.rst\n",
"../start.rst\n"
]
}
],
"source": [
"!find .. -name \"*.rst\""
]
},
{
"cell_type": "markdown",
"id": "b3555078",
"metadata": {},
"source": [
"Jetzt zählen wir die Zeichen in den Dateien mit der Endung `.rst`:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "065f56a6",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" 981 ../index.rst\n",
" 531 ../unix-shell/index.rst\n",
" 2414 ../extensions.rst\n",
" 1321 ../start.rst\n",
" 5247 total\n"
]
}
],
"source": [
"!wc -c $(find .. -name \"*.rst\")"
]
},
{
"cell_type": "markdown",
"id": "4cae6911",
"metadata": {},
"source": [
"Es ist auch möglich, in diesen Dateien nach einem regulären Ausdruck zu suchen:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "34cb164e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"../index.rst:`IPython `_ oder *Interactive Python* war zunächst ein\n"
]
}
],
"source": [
"!grep \"ipython.org\" $(find .. -name \"*.rst\")"
]
},
{
"cell_type": "markdown",
"id": "8a465167",
"metadata": {},
"source": [
"Schließlich filtern wir alle Ergebnisse heraus, deren Pfad `ipynb_checkpoints` enthält:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "77a2ac54",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"./create-delete.ipynb\n",
"./file-system.ipynb\n",
"./pipes-filters.ipynb\n",
"./shell-variables.ipynb\n",
"./grep-find.ipynb\n"
]
}
],
"source": [
"!find . -name \"*.ipynb\" | grep -v ipynb_checkpoints"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3.13 Kernel",
"language": "python",
"name": "python313"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.0"
},
"latex_envs": {
"LaTeX_envs_menu_present": true,
"autoclose": false,
"autocomplete": true,
"bibliofile": "biblio.bib",
"cite_by": "apalike",
"current_citInitial": 1,
"eqLabelWithNumbers": true,
"eqNumInitial": 1,
"hotkeys": {
"equation": "Ctrl-E",
"itemize": "Ctrl-I"
},
"labels_anchors": false,
"latex_user_defs": false,
"report_style_numbering": false,
"user_envs_cfg": false
},
"widgets": {
"application/vnd.jupyter.widget-state+json": {
"state": {},
"version_major": 2,
"version_minor": 0
}
}
},
"nbformat": 4,
"nbformat_minor": 5
}