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

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

  • 解答例の範囲: 問題1〜問題10

問題1

$ grep '\.exe$' files.txt
test.exe
画面仕様書.xls.exe

問題2

$ ls *.png | sed -E 's/(.*)\.png/convert \1.png \1.jpg/' | sh

# `ls`を利用しない別解
$ mogrify -format jpg *.png

処理時間はそれぞれ次の通りです。

$ time ls *.png | sed -E 's/(.*)\.png/convert \1.png \1.jpg/' | sh

real    0m7.038s
user    0m5.092s
sys     0m1.629s

# `ls`を利用しない別解
$ time mogrify -format jpg *.png

real    0m5.989s
user    0m4.597s
sys     0m1.174s

問題3

# 時間節約のため、`ls -U`でソートなしでファイル名を取得
$ ls -U | sed -E 'h;s/.*/000000&/;s/.*(.{7})$/\1/;H;x' | xargs -n2 -P2 mv 2>/dev/null

# 確認
$ ls | head
0000001
0000002
0000003
0000004
0000005
0000006
0000007
0000008
0000009
0000010
$ ls | tail
0999991
0999992
0999993
0999994
0999995
0999996
0999997
0999998
0999999
1000000

問題4

# ここではファイル`2040`が該当
$ grep -r '^10$' .
./2040:10

# 該当するファイルを削除(解答例)
$ grep -lr '^10$' . | xargs rm

# 確認
$ cat 2040
cat: 2040: そのようなファイルやディレクトリはありません

問題5

$ cat ntp.conf | awk '$1=="pool"{print $2}'
0.debian.pool.ntp.org
1.debian.pool.ntp.org
2.debian.pool.ntp.org
3.debian.pool.ntp.org

なお、抽出されるサーバ名は実行環境により異なります。


問題6

$ perl -E 'for($i=4;$i>=0;$i--){say " "x$i.x}'
    x
   x
  x
 x
x

問題7

$ awk '{sum+=($1<20191001||$2~/^\*/)?int($3*1.08):int($3*1.1)}END{print sum}' kakeibo.txt
53612

問題8

$ awk -F: '$(NF-2)<12{am+=1}$(NF-2)>=12{pm+=1}END{printf "午前:%d\n午後:%d\n",am,pm}' access.log
午前:2
午後:3

問題9

$ sed '/24\/Dec\/2016 21:/,/25\/Dec\/2016 03:/!d' log_range.log
192.168.77.248 - - [24/Dec/2016 21:12:20] "GET / HTTP/1.0" 200 4294
192.168.152.143 - - [24/Dec/2016 22:06:19] "GET / HTTP/1.0" 200 7255
192.168.6.132 - - [24/Dec/2016 23:00:42] "GET / HTTP/1.0" 200 4298
192.168.222.3 - - [25/Dec/2016 00:03:23] "GET / HTTP/1.0" 200 8547
192.168.101.95 - - [25/Dec/2016 01:01:40] "GET / HTTP/1.0" 200 8488
192.168.141.18 - - [25/Dec/2016 02:15:52] "GET / HTTP/1.0" 200 4533
192.168.110.169 - - [25/Dec/2016 03:06:54] "GET / HTTP/1.0" 200 3461

問題10

$ sed -E 's/^# (.*)/\1\n===/;s/^## (.*)/\1\n---/' headings.md
AAA
===

これはAAAです

BBB
===

これはBBBです。
楽しいですね。

CCC
---

これはCCCCです

DDD
---

これはDDDです
Written on October 12, 2022