From 46ab8d61a901fd36db46266e6dd15eab4c144c8a Mon Sep 17 00:00:00 2001 From: waldek Date: Tue, 10 May 2022 15:06:43 +0200 Subject: [PATCH] continues grep and file manipulation --- assets/io_01.dia | Bin 0 -> 1617 bytes assets/io_01.png | Bin 0 -> 5182 bytes assets/io_02.dia | Bin 0 -> 1285 bytes assets/io_02.png | Bin 0 -> 1888 bytes assets/io_03.dia | Bin 0 -> 1352 bytes assets/io_03.png | Bin 0 -> 2992 bytes assets/io_04.dia | Bin 0 -> 1354 bytes assets/io_04.png | Bin 0 -> 2980 bytes essential/introduction_to_the_commandline.md | 304 ++++++++++++++++++- essential/solutions.md | 2 + 10 files changed, 304 insertions(+), 2 deletions(-) create mode 100644 assets/io_01.dia create mode 100644 assets/io_01.png create mode 100644 assets/io_02.dia create mode 100644 assets/io_02.png create mode 100644 assets/io_03.dia create mode 100644 assets/io_03.png create mode 100644 assets/io_04.dia create mode 100644 assets/io_04.png create mode 100644 essential/solutions.md diff --git a/assets/io_01.dia b/assets/io_01.dia new file mode 100644 index 0000000000000000000000000000000000000000..ad5652e4d88484c53f72e2272ce51f3dc6631278 GIT binary patch literal 1617 zcmV-X2Cn%ZiwFP!000021MOQ|Z`(E$e$THEl$Q>OY27U~O^Ov=(E-CcwCPJ<4BDb) zF0^P+v>oqZzkQ@6*U`-vUEIrLAPKA-osWk){LXhs`_=2G1yRXnb-OYsvhxKP9$VI<$(sdLVkFNed;W&_AJf}Aoy@Crm|_%9>` z4u#QBy}weF=MH?xp}dw}g`6`yS#hLsk6z zhpD4s#?t}sOBkRDL-4WMxh7toSI_wpvApBOl15mV@a?i-QsGDberA(eMZzcy?yrBf zu9G397xuo&23iTi7mx)wEaHgSA<0x2z%>j*Oo#2co;I>Z`fg6nhnrj$j$9UwT^0^U z<0WOBLClMg6G{n!VS>up3f0GnrjUpfI}}!fC}x;*dSv`FNTO2$NG^X}ZRf7sfMNge z!p&Gzc=5O5FP?V#NH*B#^YK$hk0kNF?a2EYM|eU|+30b|TXVl{$9+Bn;u^8PyZlx)(GDCzj&vrABfv);XXmhQ=eOVjurp_}O(GOi4izaSH;84)T6 zq3%_=(B#;^Q$J|g6_KAu;a8}F!m5s^GbKOgW?rb~oKGfs-%N%a1_Y)4ZQ$7g z0%-QFp#$Bt^qYY$uGPat1TDr>%EF>zZYQW1ATD{uz;@-%2AXT>y5rckXW6FXm<_Pz z2nTas4QAByEmzREq;ERDaLz+Pkd5QVT^+$ltLJ=A7z6f(b}K|8>VRT7zoybMrYS7t(NlC2mQ3?o&E_*Qa{AdBSI_lT?! z$5Z&6CeI&1A!SRSjjLr}Rx{8njg_u?7uc2|=tZ5UgDtG6iwi-B+PT zL7h^Etp97-`8g`XlF=!OqP{S6T^I~kF2uenbXFDKrj7TrQ-icJ7)>jK*>Qhj+Q4-! zS5^l7*3v-Iozw$dAP$d_hmS>r-eJ)(yKQ|;;ALLUcUXf64$-kV#DmVUklp}HF8&oO zKKetHa1O`}6LJDb{s`=QEZy;Z#pNdtu%|Swu)SEi)!edTXel8ssUXq~&t5@vtsqQy zryrbNKOEN&2bRWIp752d#L@ws#gPOr$8*Z?KO$KnIY?i*ef_gxgv^nt-Wf==n#g0; z1AA)6Cg~If_etm=A2MGExGy;P0)syUH8%)v&@366*&r&hQnK7|vhjpjj6ym6|JrQAlycQMY%I-hPTu?+>=Q)kf zo0R>35Uc%xc_<%56i7wuH(j>c_VqOQ@vLnTZLgJ$4Xnv;}!#>LxMb!1lwxVP9?|&{nKd-DfzKy$e)KH zt+pBRL2lC(xzTCNjm0LfeO?rL(XeEX2u7k=^ll9c*rQSXCj657nx7ut{{CmbtJ(Rv z=q?X|Zfl;^?`+oI*<8m%YP_dei$l#E4PJ-^M~&O*k`}T3c3KCf=a_pM6fLK2OGWi# z(BOy956TPum!1ndKjHbBjTa=te23nXVN)`+z6}|=ZIEHERqTQbEzJ~?Py>eGLf4gK zsCkZY^Fw@GPO#x`A3rKDjGhfI!iF*(P0Q1qOMGOm*o*gE*pv(Hrd*i3kH777f0g+< P)cw_e6A@M9CO`lHnqV5? literal 0 HcmV?d00001 diff --git a/assets/io_01.png b/assets/io_01.png new file mode 100644 index 0000000000000000000000000000000000000000..e0b3fc9b05537040ff97a9a1c5374459559fb00f GIT binary patch literal 5182 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 literal 0 HcmV?d00001 diff --git a/assets/io_02.dia b/assets/io_02.dia new file mode 100644 index 0000000000000000000000000000000000000000..6b408da6412e48a7819d6058f6e102f26bbe3973 GIT binary patch literal 1285 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 Kv+Dy_G5`SCbD@C% literal 0 HcmV?d00001 diff --git a/assets/io_03.png b/assets/io_03.png new file mode 100644 index 0000000000000000000000000000000000000000..5af8868bd1c56d63e38004c9714b1d23a4c2d601 GIT binary patch literal 2992 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 character. +An example... + +``` +waldek@debian:~$ ls -l +total 0 +waldek@debian:~$ date +Tue 10 May 2022 12:23:13 PM CEST +waldek@debian:~$ date > date_now.txt +waldek@debian:~$ ls -l +total 4 +-rw-r--r-- 1 waldek waldek 33 May 10 12:23 date_now.txt +waldek@debian:~$ cat date_now.txt +Tue 10 May 2022 12:23:25 PM CEST +waldek@debian:~$ +``` + +![IO bash](../assets/io_02.png) + +It's very important to realize that the file you redirect too will be overwritten! +So if you run the above `date > date_now.txt` again, the file will show a more recent date. +We can also [append](https://en.wikipedia.org/wiki/Append) to an existing file by ising the `>>`. +This redirection will add the date to the end of the file if the file exists, otherwise it will just create one. + +``` +waldek@debian:~$ date >> date_now.txt +waldek@debian:~$ date >> date_now.txt +waldek@debian:~$ date >> date_now.txt +waldek@debian:~$ cat date_now.txt +Tue 10 May 2022 12:23:25 PM CEST +Tue 10 May 2022 12:27:23 PM CEST +Tue 10 May 2022 12:27:24 PM CEST +Tue 10 May 2022 12:27:25 PM CEST +waldek@debian:~$ +``` + +We can also choose which of the two outputs, STDOUT or STDERR, we want to redirect. +This is done by adding the **stream ID** to the redirection. +Observe the following output where I search for my username in each file located at `/etc`. + +``` +waldek@debian:~$ grep -R waldek /etc/ +/etc/group-:cdrom:x:24:waldek +/etc/group-:floppy:x:25:waldek +/etc/group-:sudo:x:27:waldek +/etc/group-:audio:x:29:waldek +/etc/group-:dip:x:30:waldek +/etc/group-:video:x:44:waldek +/etc/group-:plugdev:x:46:waldek +/etc/group-:netdev:x:108:waldek +/etc/group-:waldek:x:1000: +grep: /etc/sv/ssh/log/supervise: No such file or directory +grep: /etc/sv/ssh/supervise: No such file or directory +/etc/passwd-:waldek:x:1000:1000:waldek,,,:/home/waldek:/bin/bash +grep: /etc/gshadow: Permission denied +/etc/subuid:waldek:100000:65536 +grep: /etc/security/opasswd: Permission denied +grep: /etc/gshadow-: Permission denied +grep: /etc/sudoers.d/README: Permission denied +grep: /etc/.pwd.lock: Permission denied +grep: /etc/runit/runsvdir/default/ssh/log/supervise: No such file or directory +grep: /etc/runit/runsvdir/default/ssh/supervise: No such file or directory +grep: /etc/ssh/ssh_host_ecdsa_key: Permission denied +grep: /etc/ssh/ssh_host_ed25519_key: Permission denied +grep: /etc/ssh/ssh_host_rsa_key: Permission denied +grep: /etc/shadow-: Permission denied +grep: /etc/ssl/private: Permission denied +/etc/group:cdrom:x:24:waldek +/etc/group:floppy:x:25:waldek +/etc/group:sudo:x:27:waldek +/etc/group:audio:x:29:waldek +/etc/group:dip:x:30:waldek +/etc/group:video:x:44:waldek +/etc/group:plugdev:x:46:waldek +/etc/group:netdev:x:108:waldek +/etc/group:waldek:x:1000: +grep: /etc/shadow: Permission denied +grep: /etc/sudoers: Permission denied +/etc/subgid:waldek:100000:65536 +/etc/passwd:waldek:x:1000:1000:waldek,,,:/home/waldek:/bin/bash +waldek@debian:~$ +``` + +We can see quite a few `Permission denied` lines which are errors. +Because STDERR is connected to our terminal by default, we also see them printed on the screen. +Let's play around with the above command a bit. +First a simple redirection. + +``` +waldek@debian:~$ grep -R waldek /etc/ > files_with_my_name +grep: /etc/sv/ssh/log/supervise: No such file or directory +grep: /etc/sv/ssh/supervise: No such file or directory +grep: /etc/gshadow: Permission denied +grep: /etc/security/opasswd: Permission denied +grep: /etc/gshadow-: Permission denied +grep: /etc/sudoers.d/README: Permission denied +grep: /etc/.pwd.lock: Permission denied +grep: /etc/runit/runsvdir/default/ssh/log/supervise: No such file or directory +grep: /etc/runit/runsvdir/default/ssh/supervise: No such file or directory +grep: /etc/ssh/ssh_host_ecdsa_key: Permission denied +grep: /etc/ssh/ssh_host_ed25519_key: Permission denied +grep: /etc/ssh/ssh_host_rsa_key: Permission denied +grep: /etc/shadow-: Permission denied +grep: /etc/ssl/private: Permission denied +grep: /etc/shadow: Permission denied +grep: /etc/sudoers: Permission denied +``` + +We only see the errors now! +Where did our actual output go? + +``` +waldek@debian:~$ ls -l +total 4 +-rw-r--r-- 1 waldek waldek 722 May 10 12:34 files_with_my_name +waldek@debian:~$ cat files_with_my_name +/etc/group-:cdrom:x:24:waldek +/etc/group-:floppy:x:25:waldek +/etc/group-:sudo:x:27:waldek +/etc/group-:audio:x:29:waldek +/etc/group-:dip:x:30:waldek +/etc/group-:video:x:44:waldek +/etc/group-:plugdev:x:46:waldek +/etc/group-:netdev:x:108:waldek +/etc/group-:waldek:x:1000: +/etc/passwd-:waldek:x:1000:1000:waldek,,,:/home/waldek:/bin/bash +/etc/subuid:waldek:100000:65536 +/etc/group:cdrom:x:24:waldek +/etc/group:floppy:x:25:waldek +/etc/group:sudo:x:27:waldek +/etc/group:audio:x:29:waldek +/etc/group:dip:x:30:waldek +/etc/group:video:x:44:waldek +/etc/group:plugdev:x:46:waldek +/etc/group:netdev:x:108:waldek +/etc/group:waldek:x:1000: +/etc/subgid:waldek:100000:65536 +/etc/passwd:waldek:x:1000:1000:waldek,,,:/home/waldek:/bin/bash +waldek@debian:~$ +``` + +If we want to do the *reverse* we can redirect the STDERR by using `2>`. +An example... + +``` +waldek@debian:~$ grep -R waldek /etc/ 2> files_with_my_name +/etc/group-:cdrom:x:24:waldek +/etc/group-:floppy:x:25:waldek +/etc/group-:sudo:x:27:waldek +/etc/group-:audio:x:29:waldek +/etc/group-:dip:x:30:waldek +/etc/group-:video:x:44:waldek +/etc/group-:plugdev:x:46:waldek +/etc/group-:netdev:x:108:waldek +/etc/group-:waldek:x:1000: +/etc/passwd-:waldek:x:1000:1000:waldek,,,:/home/waldek:/bin/bash +/etc/subuid:waldek:100000:65536 +/etc/group:cdrom:x:24:waldek +/etc/group:floppy:x:25:waldek +/etc/group:sudo:x:27:waldek +/etc/group:audio:x:29:waldek +/etc/group:dip:x:30:waldek +/etc/group:video:x:44:waldek +/etc/group:plugdev:x:46:waldek +/etc/group:netdev:x:108:waldek +/etc/group:waldek:x:1000: +/etc/subgid:waldek:100000:65536 +/etc/passwd:waldek:x:1000:1000:waldek,,,:/home/waldek:/bin/bash +waldek@debian:~$ +``` + +And the file content. + +``` +waldek@debian:~$ cat files_with_my_name +grep: /etc/sv/ssh/log/supervise: No such file or directory +grep: /etc/sv/ssh/supervise: No such file or directory +grep: /etc/gshadow: Permission denied +grep: /etc/security/opasswd: Permission denied +grep: /etc/gshadow-: Permission denied +grep: /etc/sudoers.d/README: Permission denied +grep: /etc/.pwd.lock: Permission denied +grep: /etc/runit/runsvdir/default/ssh/log/supervise: No such file or directory +grep: /etc/runit/runsvdir/default/ssh/supervise: No such file or directory +grep: /etc/ssh/ssh_host_ecdsa_key: Permission denied +grep: /etc/ssh/ssh_host_ed25519_key: Permission denied +grep: /etc/ssh/ssh_host_rsa_key: Permission denied +grep: /etc/shadow-: Permission denied +grep: /etc/ssl/private: Permission denied +grep: /etc/shadow: Permission denied +grep: /etc/sudoers: Permission denied +waldek@debian:~$ +``` + +Now the errors are not *that* interesting too us so we can send this output to a *black hole* or *trash* location. +This is done by sending STDERR to `/dev/null`. +You'll see this redirection in a lot of places! +Try it out when you're searching for files with `find` and set the start of the search at the root of your system `/`. + +``` +waldek@debian:~$ grep -R waldek /etc/ 2> /dev/null +/etc/group-:cdrom:x:24:waldek +/etc/group-:floppy:x:25:waldek +/etc/group-:sudo:x:27:waldek +/etc/group-:audio:x:29:waldek +/etc/group-:dip:x:30:waldek +/etc/group-:video:x:44:waldek +/etc/group-:plugdev:x:46:waldek +/etc/group-:netdev:x:108:waldek +/etc/group-:waldek:x:1000: +/etc/passwd-:waldek:x:1000:1000:waldek,,,:/home/waldek:/bin/bash +/etc/subuid:waldek:100000:65536 +/etc/group:cdrom:x:24:waldek +/etc/group:floppy:x:25:waldek +/etc/group:sudo:x:27:waldek +/etc/group:audio:x:29:waldek +/etc/group:dip:x:30:waldek +/etc/group:video:x:44:waldek +/etc/group:plugdev:x:46:waldek +/etc/group:netdev:x:108:waldek +/etc/group:waldek:x:1000: +/etc/subgid:waldek:100000:65536 +/etc/passwd:waldek:x:1000:1000:waldek,,,:/home/waldek:/bin/bash +waldek@debian:~$ cat /dev/null +waldek@debian:~$ +``` + +If you want to redirect **both** outputs to a file you can use the `&>` syntax. +The file will then contain **everything** that would be printed out on the terminal. + +``` +waldek@debian:~$ grep -R waldek /etc/ &> files_with_my_name +waldek@debian:~$ +``` + +TODO - input redirection + +## Piping + +A *very* powerful fundamental concept of the command line is are **pipes** which are created with the `|` character. +Their purpose is to send the STDOUT of one process to the STDIN of a following. +They might seem similar to redirection but they are fundamentally different. +A redirect sends **to** or **from** a **file** while a pipe sends to and from a **process**. + +![IO bash](../assets/io_03.png) + +As always, an example should clarify it better. + +``` +waldek@debian:~$ ls -l /etc/* | grep "d.conf" +-rw-r--r-- 1 root root 6169 Feb 27 2021 /etc/sudo_logsrvd.conf +-rw-r--r-- 1 root root 3289 Mar 13 2021 sshd_config +drwxr-xr-x 2 root root 4096 Mar 13 2021 sshd_config.d +-rw-r--r-- 1 root root 1052 Mar 20 20:55 journald.conf +-rw-r--r-- 1 root root 1145 Mar 20 20:55 logind.conf +-rw-r--r-- 1 root root 609 Feb 2 2021 networkd.conf +-rw-r--r-- 1 root root 943 Mar 20 20:55 resolved.conf +-rw-r--r-- 1 root root 677 Mar 20 20:55 timesyncd.conf +waldek@debian:~$ +``` + +In the example above we send the output of `ls -l /etc/*` to `grep "d.conf"`. +We go from *a lot* of output to *less*. +Pipes are a very powerful tool to do text manipulations! + +# Text manipulation + +| command | description | +| --- | --- | +| cut | remove sections from each line of files | +| sort | sort lines of text files | +| uniq | report or omit repeated lines | +| grep | print lines that match patterns | +| tr | translate or delete characters | +| sed | stream editor for filtering and transforming text | +| nl | number lines of files | +| wc | print newline, word, and byte counts for each file | +| seq | print a sequence of numbers | +| diff | compare files | +| cat | concatenate files and print on the standard output | +| tac | concatenate and print files in reverse | +| comm | compare two sorted files line by line | +| shuf | generate random permutations | + + diff --git a/essential/solutions.md b/essential/solutions.md new file mode 100644 index 0000000..668325a --- /dev/null +++ b/essential/solutions.md @@ -0,0 +1,2 @@ +`find / -iname "*ssh*" -size -10c 2> /dev/null` +`grep -R -n "hip.op" /usr/ 2> /dev/null`