たいちょーの雑記

ぼくが3日に一度くらい雑記をかくところ

シェル芸160ノック26

9月末に発売されたシェル芸本の続きです。

gihyo.jp

前回はこちら

xztaityozx.hatenablog.com

問題141

$ yes | awk '{print "echo",NR",""$(shuf -n5 -re {a..z}),$(shuf -n10 -re {a..z}),$(shuf -n5 -re {a..z})@mail.com"}' | head -n1000 |bash | tr -d ' ' | head
1,hyoah,pgdawiluzg,xwrui@mail.com
2,xbabm,gnmbcoxsri,ixpzm@mail.com
3,jyojm,rdjdcqqcus,hwrpa@mail.com
4,ehzdr,ihdnpkjvzi,gknmw@mail.com
5,jdxht,hnyxucnbcw,rvvvi@mail.com
6,bypgy,brjilztgyc,pnqwy@mail.com
7,foxwp,aymknffafy,mvclb@mail.com
8,dlwte,umqxtwcdal,uwoth@mail.com
9,wbhkw,cxrtjswfmt,bxsrq@mail.com
10,alkvf,bpdwkemdsh,phqcv@mail.com

問題142

$ echo blog.ueda | command xxd -b -c1 | sel 2 | tr -d \\n | ocs '{for(var i=0;i<F0.Length;i++)println(F0)}' | awk '{$NR=!$NR;print}' FS='' OFS='' | perl -lne 'print pack("B*", $_)' | grep -P '^[a-z\.]+$'
rlog.ueda
jlog.ueda
flog.ueda
clog.ueda
bdog.ueda
bhog.ueda
bnog.ueda
bmog.ueda
blgg.ueda
...

問題143

$ git status  --short | awk '$1=="M"&&$2~/B/{print $2}'  | xargs git add

問題144

$ fd . ./img ./css --type=f --exec git checkout "HEAD^" {}
Updated 1 path from c335175
Updated 1 path from c335175
Updated 1 path from c335175
Updated 1 path from c335175

問題145

$ git log --date=unix | grep Date: | awk '{if(b)print $2,b;b=$2}' | awk '{print ($2-$1)/3600}'
5.87694
0.0141667
232.218
47.4703
31.0544
0.0580556
16.2336
1181.22
1345.62
1581.95
...

シェル芸160ノック25

9月末に発売されたシェル芸本の続きです。組み合わせの列挙系は楽しいですね。

gihyo.jp

前回はこちら

xztaityozx.hatenablog.com

問題132

$ cat ./qdata/132/httpd-access.log | awk '$(NF-1)==500' | while read L; do mail -s "500があったよ" こ こにメールアドレス <<< $L; done

問題133

$ echo "@reboot sleep 180s && shutdown -h now" | sudo crontab

問題134

$ grep -vnPe "^( {4})*[^ ]|^$" qdata/134/hoge.py
5:     print(i+1)

$ autopep8 qdata/134/hoge.py --select E11 --diff
--- original/qdata/134/hoge.py
+++ fixed/qdata/134/hoge.py
@@ -2,5 +2,5 @@

 for i in range(1,10):
     print(i)
-     print(i+1)
+    print(i+1)
     print(i+2)

autopep8解はもうちょっと成形してやる方が題意通りだけど、diffの方がいいかなって

問題135

cat qdata/135/sample.lisp | grep defun | ocs "F0.Count(c=>c=='(')!=F0.Count(c=>c==')'){println(F[2])}"
fib
sum1

問題136

$ cat qdata/136/somecode.c | awk '/^#/{h=h$0"\n"}/void a/,/^\}/{a=a$0"\n"}/int b/,/^\}/{b=b$0"\n"}/main/,/^}/{m=m$0"\n"}END{print h;print a;print b;print m}'
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void a()
{
        int i = 0, j = b();
        for (; i < j; i++){
                puts("a");
        }
}

int b()
{
        return rand()%10;
}

int main(int argc, char const *argv[])
{
        srand(time(NULL));
        a();
        return 0;
}

問題137

$ clang-format ./qdata/137/fib.c
#include <stdio.h>

int fib(int n) {
  if (n <= 1) {
    return n;
  }
  return fib(n - 1) + fib(n - 2);
}

int main(void) {
  int i;
  for (i = 0; i < 10; i++) {
    printf("%d\n", fib(i));
  }
  return 0;
}

問題138

$ cat os.csv|tr , \\n| join -j9 - <(cat service.csv|tr , \\n) | join -j9 - <(cat browser.csv|tr , \\n)| awk '!($1!="Windows"&&$3=="IE")&&!($1!="macOS"&&$3=="Safari")'
 Windows ServiceA IE
 Windows ServiceA Chrome
 Windows ServiceA FireFox
 Windows ServiceB IE
 Windows ServiceB Chrome
 Windows ServiceB FireFox
 Windows ServiceC IE
 Windows ServiceC Chrome
 Windows ServiceC FireFox
 macOS ServiceA Chrome
 macOS ServiceA FireFox
 macOS ServiceA Safari
 macOS ServiceB Chrome
 macOS ServiceB FireFox
 macOS ServiceB Safari
 macOS ServiceC Chrome
 macOS ServiceC FireFox
 macOS ServiceC Safari
 Linux ServiceA Chrome
 Linux ServiceA FireFox
 Linux ServiceB Chrome
 Linux ServiceB FireFox
 Linux ServiceC Chrome
 Linux ServiceC FireFox

問題139

$ echo https://{,{,{,cc.}bb.}aa.}example.com/A{/B{/C,},} | fmt -1
https://example.com/A/B/C
https://example.com/A/B
https://example.com/A
https://aa.example.com/A/B/C
https://aa.example.com/A/B
https://aa.example.com/A
https://bb.aa.example.com/A/B/C
https://bb.aa.example.com/A/B
https://bb.aa.example.com/A
https://cc.bb.aa.example.com/A/B/C
https://cc.bb.aa.example.com/A/B
https://cc.bb.aa.example.com/A

一般解じゃないのでダメかな?

問題140

$ mkdir tmp
$ cp ./dir.tar.gz ./tmp/
$ cd ./tmp
$ tar xvfz ./dir.tar.gz
$ rm ./dir.tar.gz
$ shuf -i 0-255 -rn 400 | paste - - - - -d. | paste - <(dateutils.dseq --format "- - [%Y/%m/%d %H:%M:%S +0900] \"GET" 2021-01-01T00:00:00 1s 2021-12-31T23:59:59 | shuf -n 100 | sort) | paste -d ' ' - <(fd . ./ --exec echo /{}|shuf -rn100) | sed 's@$@ HTTP/1.1" 200@' | paste -d ' ' - <(shuf -i 100-1000 -rn100)
225.20.241.13   - - [2021/01/09 05:13:30 +0900] "GET /js/bootstrap.js HTTP/1.1" 200 272
208.207.0.117   - - [2021/01/13 12:36:05 +0900] "GET /product.php HTTP/1.1" 200 593
14.11.149.123   - - [2021/01/19 04:56:24 +0900] "GET /cart.php HTTP/1.1" 200 153
242.122.183.51  - - [2021/01/21 16:38:16 +0900] "GET /search.php HTTP/1.1" 200 334
220.85.189.142  - - [2021/01/24 16:01:08 +0900] "GET /js/main.js HTTP/1.1" 200 494
122.200.73.176  - - [2021/01/25 18:47:54 +0900] "GET /index.php HTTP/1.1" 200 266
22.80.42.4      - - [2021/02/02 04:45:09 +0900] "GET /img HTTP/1.1" 200 757
129.176.186.244 - - [2021/02/04 06:21:02 +0900] "GET /js/bootstrap.js HTTP/1.1" 200 575
203.238.5.90    - - [2021/02/07 22:17:50 +0900] "GET /js/main.js HTTP/1.1" 200 484
233.1.189.253   - - [2021/02/08 19:48:11 +0900] "GET /img HTTP/1.1" 200 273
63.156.210.229  - - [2021/02/18 15:54:29 +0900] "GET /js/bootstrap.js HTTP/1.1" 200 530
149.201.91.75   - - [2021/03/06 01:26:53 +0900] "GET /js/main.js HTTP/1.1" 200 716
...

dseqが激重なので範囲減らすかファイルに書き出すといいと思いますね

シェル芸160ノック24

9月末に発売されたシェル芸本の続きです。

gihyo.jp

前回はこちら

xztaityozx.hatenablog.com

問題127

$ while true; do echo -en "$(tput lines) $(tput cols)\r"; done

問題128

$ man pcrepattern | tail -n1 | sel 1 2
PCRE 8.38

問題129

$ base64 -d qdata/129/crypt | zcat | xxd | grep 50: | sel -- -1 | tr -d . | grep -o .... | sed "s/.*/echo -e '\\\\U&'/" | bash | tr -d \\n
シェル

30..みたいな文字列から日本語っぽいな…?とまではならなかった…まだまだですね

問題130

$  python3 -m http.server

問題131

wget example.com/big_file.tar.gz && { echo "完了だよ!" | mail -s "通知だよ" ここにメールアドレス } || { echo "失敗だよ!" | mail -s "通知だよ" ここにメールアドレス }

メールじゃなくてwslからwindowsのトーストを表示させようと思ったんだけどある程度のサイズのスクリプトを用意しないといけないのでやめた

シェル芸160ノック23

9月末に発売されたシェル芸本の続きです。むずかしい

gihyo.jp

前回はこちら

xztaityozx.hatenablog.com

問題121

$ (strace seq 1e7 | head) |& grep -oPe '"[^"]+"' | grep /
"/usr/bin/seq"
"/etc/ld.so.preload"
"/etc/ld.so.cache"
"/lib/x86_64-linux-gnu/libc.so.6"
"/usr/lib/locale/locale-archive"
"/usr/share/locale/locale.alias"
"/usr/lib/locale/C.UTF-8/LC_IDENTIFICATION"
"/usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache"
"/usr/lib/locale/C.UTF-8/LC_MEASUREMENT"
"/usr/lib/locale/C.UTF-8/LC_TELEPHONE"
"/usr/lib/locale/C.UTF-8/LC_ADDRESS"
"/usr/lib/locale/C.UTF-8/LC_NAME"
"/usr/lib/locale/C.UTF-8/LC_PAPER"
"/usr/lib/locale/C.UTF-8/LC_MESSAGES"
"/usr/lib/locale/C.UTF-8/LC_MESSAGES/SYS_LC_MESSAGES"
"/usr/lib/locale/C.UTF-8/LC_MONETARY"
"/usr/lib/locale/C.UTF-8/LC_COLLATE"
"/usr/lib/locale/C.UTF-8/LC_TIME"
"/usr/lib/locale/C.UTF-8/LC_NUMERIC"
"/usr/lib/locale/C.UTF-8/LC_CTYPE"

問題122

$ strace xargs -n1 < qdata/122/words|&grep -cPe "^clone"
3000

問題123

$ awk -F '[( ]' '$NF ~ /\<[0-9]+\>/{print FILENAME=="dir1_strace"?1:2,$1,$NF}' dir{1,2}_strace  | tr -d "<>" | awk '{a[$2]+=$1==1?-$3:$3}END{for(k in a) print k, a[k]*1000}' | sort -k2nr | head -n3
read 11879.7
openat 860.119
close 487.181

問題124

$ ip a | sel 2 | tr -d : | xargs
lo bond0 dummy0 eth0 tunl0@NONE sit0@NONE

selはデフォルトの区切り文字がスペース1つなのがこういう時ちょっと便利

問題125

壊していいLinuxが無かった

問題126

$ bash --version                                                                                      
GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

シェル芸160ノック22

9月末に発売されたシェル芸本の続きです。

gihyo.jp

前回はこちら

xztaityozx.hatenablog.com

問題116

$ exa /dev/ -l | grep "^b" | awk '{print $NF,$2}'
loop0 7,0
loop1 7,1
loop2 7,2
loop3 7,3
loop4 7,4
loop5 7,5
loop6 7,6
loop7 7,7
ram0 1,0
ram1 1,1
ram2 1,2
ram3 1,3
ram4 1,4
ram5 1,5
ram6 1,6
ram7 1,7
ram8 1,8
ram9 1,9
ram10 1,10
ram11 1,11
ram12 1,12
ram13 1,13
ram14 1,14
ram15 1,15
sda 8,0
sdb 8,16

$ exa -l /sys/dev/block | sel -- 7 -1 | teip -f2 -- zsh -c "xargs -n1 -I@ basename @"
1:0 ram0
1:1 ram1
1:2 ram2
1:3 ram3
1:4 ram4
1:5 ram5
1:6 ram6
1:7 ram7
1:8 ram8
1:9 ram9
1:10 ram10
1:11 ram11
1:12 ram12
1:13 ram13
1:14 ram14
1:15 ram15
7:0 loop0
7:1 loop1
7:2 loop2
7:3 loop3
7:4 loop4
7:5 loop5
7:6 loop6
7:7 loop7
8:0 sda
8:16 sdb

問題117

$ b=$(lsusb | wc -l); while :; do a=$(lsusb | wc -l); [[ "$a" -gt "$b" ]] && echo "挿されました" || [[ "$a" -lt "$b" ]] && echo "抜かれました"; b=$a sleep 1s; done

lsusbの出力をエスパーしてます

問題118

$ ./hidoi.bash
5728

$ awk '$4==5728{print $1}' /proc/[0-9]*/stat | xargs -n1 -I@ ls /proc/@/fd/1 -l | sel -- -1
/home/xztaityozx/ghq/github.com/shellgei/shellgei160/qdata/118/5728
/tmp/tmp.IvE4RzXOKL
/home/xztaityozx/ghq/github.com/shellgei/shellgei160/qdata/118/1639576737.611781307

問題119

$ fd . /sys/firmware/memmap/ --max-depth=1 --type=d --exec paste {}/start {}/end {}/type | teip -f1,2 -- xargs -n1 printf "0x%016x\n" | awk '{$1=$1"-"$2;$2="";print}' | sort
0x0000000000000000-0x000000000009ffff  System RAM
0x00000000000e0000-0x00000000000e0fff  Reserved
0x0000000000100000-0x00000000001fffff  ACPI Tables
0x0000000000200000-0x00000000f7ffffff  System RAM
0x0000000100000000-0x0000000669ffffff  System RAM

問題120

$ cat qdata/120/enigma | base64 -d > hoge.gz && gunzip hoge.gz && mkdir tmp &&sudo mount -o loop -t msdos hoge ./tmp && ls ./tmp && sudo umount ./tmp && rm -r tmp hoge

シェル芸160ノック21

9月末に発売されたシェル芸本の続きです。

gihyo.jp

前回はこちら

xztaityozx.hatenablog.com

問題110

$ fd . --hidden --type=d /var/log --exec zsh -c 'echo {} $(fd --type=f --max-depth=1 --hidden . {}|wc -l)'
/var/log/unattended-upgrades 0
/var/log/private 0
/var/log/journal 0
/var/log/dist-upgrade 0
/var/log/landscape 1
/var/log/apt 3

問題111

$ sel 1 2 3 -f /proc/loadavg
0.00 0.02 0.00

問題112

$ echo | ocs '{println(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))}'
2021-12-14 18:18:14

$ cat /sys/class/rtc/rtc0/{date,time} | xargs
2021-12-14 09:19:33

問題113

$ ls -ld /proc/3046/cwd | sel -- -3:
/proc/3046/cwd -> /etc/byobu

問題114

$ cat /proc/4126/maps | grep -Pe ".+\.so" | sel -- -1 | sort -u
/usr/lib/x86_64-linux-gnu/ld-2.31.so
/usr/lib/x86_64-linux-gnu/libc-2.31.so

問題115

家にUSBメモリが1枚もなくてびっくりしちゃった

$ lsblk -o KNAME,FSTYPE,MOUNTPOINT | awk NF==2 | grep fat | awk '{p="/mnt/disk"NR;print "mkdir -p "p";mount -t vfat /dev/"$1,p}' | sudo bash

シェル芸160ノック20

9月末に発売されたシェル芸本の続きです。いっぱい解いちゃった

gihyo.jp

前回はこちら

xztaityozx.hatenablog.com

問題103

$ seq 99 | awk '{print "ln hoge "$1}' | bash
$ ls -l hoge
-rw-r--r-- 100 xztaityozx xztaityozx 2 Dec 13 19:57 hoge

問題104

$ seq inf | while read L; do FN=$(perl -e "print \"a\"x$L"); touch $FN || {echo $L; break}; done
touch: cannot touch 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa': File name too long
256

問題105

$ du -sh /usr/* | sort -k2 | paste - <(du -s /usr/*|sort -k2) | sort -rnk3 | sel -gd\\s+ --remove-empty 1 2
3.7G /usr/lib
689M /usr/share
262M /usr/bin
62M /usr/include
26M /usr/sbin
648K /usr/libexec
88K /usr/local
12K /usr/games
8.0K /usr/config
4.0K /usr/src
4.0K /usr/libx32
4.0K /usr/lib64
4.0K /usr/lib32

問題106

$ ls -l /bin/ | awk '$1~/[^lwrx-]/'
total 271308
-rwsr-sr-x 1 daemon daemon      55560 Nov 13  2018 at
-rwxr-sr-x 1 root   tty         14488 Mar 30  2020 bsd-write
-rwxr-sr-x 1 root   shadow      84512 Jul 15 07:08 chage
-rwsr-xr-x 1 root   root        85064 Jul 15 07:08 chfn
-rwsr-xr-x 1 root   root        53040 Jul 15 07:08 chsh
-rwxr-sr-x 1 root   crontab     43720 Feb 14  2020 crontab
-rwxr-sr-x 1 root   shadow      31312 Jul 15 07:08 expiry
-rwsr-xr-x 1 root   root        39144 Mar  7  2020 fusermount
-rwsr-xr-x 1 root   root        88464 Jul 15 07:08 gpasswd
-rwsr-xr-x 1 root   root        55528 Jul 21  2020 mount
-rwsr-xr-x 1 root   root        44784 Jul 15 07:08 newgrp
-rwsr-xr-x 1 root   root        68208 Jul 15 07:08 passwd
-rwsr-xr-x 1 root   root        31032 May 26  2021 pkexec
-rwxr-sr-x 1 root   ssh        350504 Jul 23 21:55 ssh-agent
-rwsr-xr-x 1 root   root        67816 Jul 21  2020 su
-rwsr-xr-x 1 root   root       166056 Jan 19  2021 sudo
-rwsr-xr-x 1 root   root        39144 Jul 21  2020 umount
-rwxr-sr-x 1 root   tty         35048 Jul 21  2020 wall

問題107

WSLには /var/log/auth.log が無いらしい。のでさっき sudo systemctl start rsyslog した時のログです

$ grep sudo:session /var/log/auth.log | grep "opened for user" | sel 1 | uniq -c
      3 Dec

問題108

# 小問1
$ zcat qdata/108/syslog.gz | grep "Killed process" | sel 10 | tr -d '()' | uniq -c
      9 superapp

# 小問2
$ zcat qdata/108/syslog.gz | sed -nE 's/invoked oom-killer:.+//gp' | sel 7: | sort | uniq -c | sort -rn
      3 apache2
      2 gmain
      1 tmux: server
      1 systemd-network
      1 lsb_release
      1 apport

問題109

$ cat o | while read L F; do grep "$L" o | sed "s@\$@ $F@"; done | sel 2: --remove-empty | awk '$1!=$2'
/etc/subuid /etc/subgid
/etc/pki/fwupd/GPG-KEY-Linux-Vendor-Firmware-Service /etc/pki/fwupd-metadata/GPG-KEY-Linux-Vendor-Firmware-Service
/etc/pki/fwupd/LVFS-CA.pem /etc/pki/fwupd-metadata/LVFS-CA.pem
/etc/pki/fwupd-metadata/GPG-KEY-Linux-Vendor-Firmware-Service /etc/pki/fwupd/GPG-KEY-Linux-Vendor-Firmware-Service
/etc/pki/fwupd-metadata/LVFS-CA.pem /etc/pki/fwupd/LVFS-CA.pem
/etc/magic.mime /etc/magic
/etc/vmware-tools/suspend-vm-default /etc/vmware-tools/poweroff-vm-default
/etc/vmware-tools/poweron-vm-default /etc/vmware-tools/poweroff-vm-default
/etc/vmware-tools/resume-vm-default /etc/vmware-tools/poweroff-vm-default
/etc/vmware-tools/poweroff-vm-default /etc/vmware-tools/suspend-vm-default
/etc/vmware-tools/poweron-vm-default /etc/vmware-tools/suspend-vm-default
/etc/vmware-tools/resume-vm-default /etc/vmware-tools/suspend-vm-default
...