シェル芸160本ノック解答例 その15

技術評論社から出版された『1日1問、半年以内に習得 シェル・ワンライナー160本ノック』の解答例です。


問題141

$ sqlite3 tmp.sqlite "CREATE TABLE dummy ($(sed -Ez 's/\n$//;s/\n/,/g' tableinfo.txt));" && for i in {1..10}; do sqlite3 tmp.sqlite "INSERT INTO dummy VALUES($i,'x$(faker hexify)','$(faker first_romanized_name)','$(faker domain_word)@dummy.jp');"; done && sqlite3 -csv -header tmp.sqlite "SELECT * FROM dummy;" && rm -f tmp.sqlite
id,user_id,user_name,mail_address
1,x1c81,Mituru,inoue@dummy.jp
2,x55f9,Kana,suzuki@dummy.jp
3,xba38,Chiyo,sato@dummy.jp
4,xc31f,Naoko,kobayashi@dummy.jp
5,xb1d0,Takuma,kimura@dummy.jp
6,x4527,Momoko,maeda@dummy.jp
7,x3a08,Yosuke,watanabe@dummy.jp
8,xb675,Kyosuke,matsumoto@dummy.jp
9,x1896,Manabu,suzuki@dummy.jp
10,xd56d,Minoru,fujita@dummy.jp

なお、ダミーデータは、解答例のワンライナーを実行するたびに異なるものが生成されます。


問題142

$ echo blog.ueda | perl -nE '@b=split "",(join "",map{unpack "B*"}split "");for(0..$#b){$b[$_]=$b[$_]?0:1;say map{pack "B*",$_}(join "",@b)=~/(.{8})/g;$b[$_]=$b[$_]?0:1}' | grep -P '^[a-z.]+$' | xargs
rlog.ueda jlog.ueda flog.ueda clog.ueda bdog.ueda bhog.ueda bnog.ueda bmog.ueda blgg.ueda blkg.ueda blmg.ueda blng.ueda blow.ueda bloo.ueda bloc.ueda bloe.ueda blof.ueda blognueda blog.eeda blog.qeda blog.weda blog.teda blog.uuda blog.umda blog.uada blog.ugda blog.udda blog.ueta blog.uela blog.uefa blog.ueea blog.uedq blog.uedi blog.uede blog.uedc

問題143

# 1. 解答例 - 変更したのにコミットしていないファイルを調査
$ git ls-files -m
B.conf
about_B.md
fileA
fileB
fileC
fileD

# 2. 解答例 - 調査結果から、B関連のファイルを抽出
$ git ls-files -m | grep B
B.conf
about_B.md
fileB

# 3. 解答例 - 抽出したファイルをステージング
$ git ls-files -m | grep B | xargs git add

# `git status`で確認
$ git status
On branch main
Your branch is up to date with 'origin/main'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   B.conf
        modified:   about_B.md
        modified:   fileB

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   fileA
        modified:   fileC
        modified:   fileD


問題144

$ git restore -s HEAD^ -SW css/ img/

# `git diff`で確認
$ git diff HEAD
diff --git a/css/common.css b/css/common.css
index ce7da04..8700243 100644
--- a/css/common.css
+++ b/css/common.css
@@ -1,3 +1,3 @@
 p {
-  color: blue;
+  color: green;
 }
diff --git a/img/banner.png b/img/banner.png
index 7dc3b07..f47f027 100644
Binary files a/img/banner.png and b/img/banner.png differ
diff --git a/img/favicon.ico b/img/favicon.ico
index 14b184f..ebdeacd 100644
Binary files a/img/favicon.ico and b/img/favicon.ico differ
diff --git a/img/picture.jpg b/img/picture.jpg
index af5a386..947afbf 100644
Binary files a/img/picture.jpg and b/img/picture.jpg differ

問題145

$ paste <(git log --pretty='%at' | sed '$d') <(git log --pretty=%at | sed '1d') | awk '{print ($1-$2)/3600}'
19.2283
28.8069
21.1311
(...略...)
2.67583
0.499722
0.0302778

なお、表示されている2コミット間の時間は、2022年12月4日現在のものです(随時更新あり)。


問題146

$ git branch -r --no-merged | xargs -I@ git -P log -1 --format="%cI%x09%an%x09@" @ | dateutils.dgrep -i %FT%T%Z "<=$(dateutils.dadd -f %FT%T%Z now -1mo)"
2008-02-19T02:09:55+00:00       Jeremy Kemper   origin/1-2-stable
2009-09-10T17:41:18-07:00       Beau Harrington origin/2-0-stable
2011-01-17T14:14:24+13:00       Michael Koziarski       origin/2-1-stable
(...略...)
2022-08-23T14:12:49-04:00       eileencodes     origin/use-temp-pool-for-migrations
2021-06-30T18:01:57+09:00       Zachary Scott   origin/zzak-patch-1
2016-07-08T04:50:39+09:30       Matthew Draper  origin/ಠ_ಠ

なお、表示されている最終更新日時・最終更新者・ブランチ名は、2022年12月6日現在のものです(随時更新あり)。


問題147

$ grep -Po '<td.*?>.*?</td>' page | sed 's/<[^>]*>//g' | mecab -Owakati | sed -Ez 's/ /\n/g;s/\n+/\n/g' | sort | uniq -c | sort -k1,1nr
     84 シェル
     78 芸
     74 が
(...略...)
      1 列挙
      1 弄ば
      1 話

問題148

$ curl -s https://file.ueda.tech/eki/p/14.xml | grep -B1 京急本線 | grep -Po '\d+' | xargs -I@ curl -s https://file.ueda.tech/eki/l/@.xml | grep station_name | sed 's/^[^<]*//;s/<[^>]*>//g'
泉岳寺
品川
北品川
(...略...)
京急大津
馬堀海岸
浦賀

問題149

$ curl -s 'wttr.in/{三島,石廊崎,静岡,浜松}?format=4'
三島: ☀️   🌡️+9°C 🌬️→35km/h
石廊崎: ☀️   🌡️+15°C 🌬️→60km/h
静岡: ☀️   🌡️+7°C 🌬️→25km/h
浜松: ☀️   🌡️+9°C 🌬️→26km/h

# 気象庁の天気予報JSONデータを利用した別解
$ curl -s https://www.jma.go.jp/bosai/forecast/data/forecast/220000.json | yq -MP '.[0].timeSeries[0].areas[]|{(.area.name):{"天気":.weathers[0],"風":.winds[0],"波":.waves[0]}}'
中部:
  天気: 晴れ
  風: 西の風 やや強く 海上 では 西の風 強く
  波: 3メートル
西部:
  天気: 晴れ
  風: 西の風 やや強く 海上 では 西の風 強く
  波: 3メートル
東部:
  天気: 晴れ
  風: 西の風 海上 では 西の風 やや強く
  波: 1メートル
伊豆:
  天気: 晴れ
  風: 西の風 やや強く 海上 では 西の風 強く
  波: 3メートル

なお、表示されている天気情報は、いずれも2022年12月14日2時現在のものです。


問題150

問題150小問1

$ nkf -wxLu backnumber | grep -B3 品切 | sed 's/<[^>]*>//g' | grep '2020年.\+月号' | tac
Software Design 2020年1月号
Software Design 2020年2月号
Software Design 2020年3月号
Software Design 2020年4月号

問題150小問2

2022年12月14日現在において2020年1月号以降の全バックナンバーが品切状態のため、本来curl -s https://gihyo.jp/magazine/SD/archive/2020/2020[01-12]である部分をcat 2020に置き換えて解答しています。

$ cat 2020 | nkf -wxLu | grep -B10 在庫はございません | sed 's/<[^>]*>//g' | grep '2020年.\+月号'
Software Design 2020年1月号
Software Design 2020年2月号
Software Design 2020年3月号
Software Design 2020年4月号
Written on December 14, 2022