『オリジナルのコマンドを作ろう!』 講義資料@セキュリティ・キャンプ2025 ジュニア

2.7K Views

August 17, 25

スライド概要

セキュリティ・キャンプ2025 ジュニアの講義『オリジナルのコマンドを作ろう!』で中学生向けにコマンド・Git・正規表現を教えたときの資料です。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

オリジナルのコマンドを作ろう! セキュリティ・キャンプ2025 ジュニア アスースン・オンライン

2.

脆弱エンジニアの日常 アスースン・オンライン

3.

ゴール オリジナルのコマンドを作ってもらいます! (自作コマンドの実演)

4.

講義の概要 ①コマンド操作に慣れる ②正規表現に慣れる ③Gitコマンドに慣れる ④コマンドを作る!

5.

動作確認環境 • Mac:GNU bash, version 5.3.3 • Windows:Git Bash 2.50.1 • ※WSLだとstartコマンドが使えないようなのでスキップしてください ※環境によっては一部スライドと出力結果が異なる場合があります

6.

事前学習課題 ① 正規表現パズル https://gametsukurukun.com/regexp-puzzle/ チュートリアル「.と+を組み合わせる」まで遊ぶ 想定時間:1時間程度 余裕があればパズルやその先までチャレンジ! ② Learn Git Branching https://learngitbranching.js.org/?locale=ja 「まずはここから」と「Push及びPullコマンド -- Gitリモート」を遊ぶ 想定時間:1時間程度 余裕があればその先までチャレンジ!

7.

コマンド操作に慣れる

8.

実演①:ファイル作成 Desktopでディレクトリとファイルを作成する

9.

pwd カレントディレクトリを表示する 作業をしているディレクトリを表示します.(print working directoryの略) ディレクトリは絶対パスで表示されます. $ pwd /Users/asusn/Desktop

10.

cd カレントディレクトリを移動する 指定した相対パス/絶対パスの場所へ移動します.(change directoryの略) $ pwd /Users/asusn $ cd Desktop $ pwd /Users/asusn/Desktop cd .. cd /Users/asusn/Desktop cd ~/Desktop 1つ上のディレクトリへ Desktopへ Desktopへ (~はホームディレクトリ) cd ホームディレクトリへ cd $HOME ホームディレクトリへ cd - 直前の場所へ戻る

11.

ls ディレクトリの中身を表示する オプションで表示方法を変更できます. 引数にパスを指定することもできます. $ ls hello.txt ls -l 権限やサイズなどの詳細表示 ls -lh サイズを単位表示 ls -a 隠しファイルも表示

12.

mkdir ディレクトリを作成する make directoryの略です. $ ls $ mkdir hello $ ls hello mkdir -p ctf/seccon/2025 親フォルダもまとめて作成

13.

echo 文字列を出力する 引数がそのまま出力されます. リダイレクト(>)でファイルに書き出すことができます. $ echo "こんにちは" こんにちは # ファイルへ上書き $ echo "# ようこそ" > README.md # ファイルへ追記 $ echo "こんにちは" >> README.md echo -n 最後の改行を付けない echo -e 改行(\n)など有効化

14.

cat ファイルを表示する テキストファイルを表示したり、つなげて(concatenate)出力します. $ cat README.md # ようこそ こんにちは # ファイルを結合する $ cat note1.txt note2.txt > all̲notes.txt cat -n 行番号を付ける

15.

演習①:ファイル作成 Desktopでディレクトリとファイルを作成する

16.

演習① ファイル作成 Desktopにworkディレクトリを作って、その中にhello.txtを作成してください • Desktopへ移動し、pwdしてみる • workディレクトリを作って、 lsしてみる • workディレクトリに移動し、pwdしてみる • hello.txtを作成して、 ls、catしてみる $ pwd /Users/asusn/Desktop GUIと見比べながら やってみよう! $ ls work $ pwd /Users/asusn/Desktop/work $ ls hello.txt

17.

演習① ファイル作成 解答 Desktopにworkディレクトリを作って、その中にhello.txtを作成してください • Desktopへ移動し、pwdしてみる $ cd ~/Desktop • workディレクトリを作って、 lsしてみる $ mkdir work • workディレクトリに移動し、pwdしてみる $ cd work • hello.txtを作成して、 ls、catしてみる $ echo "こんにちは" > hello.txt $ pwd /Users/asusn/Desktop $ ls work $ cat hello.txt こんにちは $ pwd /Users/asusn/Desktop/work $ ls hello.txt

18.

Mac Win Linux open / start / xdg-open ファイルやURLを開く ファイル・フォルダ・URLをアプリで起動します. # Finderを開く $ open . # ファイルを開く $ open image.png # ブラウザでURLを開く $ open "https://www.example.com" おまけ

19.

実演②:ファイル操作 ファイルを移動・コピー・削除する

20.

cp ファイル・ディレクトリをコピー ファイルやディレクトリをコピーするコマンドです. ディレクトリをコピーする場合は -r オプションが必要です. # ファイルのコピー $ cp 元ファイル 新ファイル # ファイルをフォルダへコピー(複数可) $ cp ファイル1 ファイル2 宛先dir # ディレクトリのコピー $ cp -r 元dir 宛先dir

21.

mv ファイル場所を移動 / 名前変更 ファイルやディレクトリを移動するコマンドです.同じ場所なら名前の変更. 宛先がディレクトリなら、その中へ入ります. # ファイル名の変更 $ mv 元ファイル 新ファイル # ファイルをフォルダへ移動(複数可) $ mv ファイル1 ファイル2 宛先dir # ディレクトリ名の変更(宛先が存在しない場合)/ 移動(存在する場合) $ mv 元dir 宛先dir

22.

rm ファイル/ディレクトリを削除する ゴミ箱に入れるわけではなく、即削除されます. 慎重に作業をしましょう! $ ls hello $ rm -r hello examine files in directory hello? y remove hello? y $ ls $ rm -r ディレクトリを削除 rm -f 確認なく強制削除

23.

演習②:ファイル移動 ファイルを移動・コピーする

24.

演習② ファイル移動 先ほど作成したhello.txtをコピーして、以下のディレクトリ構成にしてください $ tree work work └── hello.txt $ tree work work ├── dir1 │ └── hello.txt ├── dir2 │ └── hello.txt └── hello.txt

25.

演習② ファイル移動 解答 先ほど作成したhello.txtをコピーして、以下のディレクトリ構成にしてください $ tree work work ├── dir1 │ └── hello.txt ├── dir2 │ └── hello.txt └── hello.txt • dir1ディレクトリを作る • hello.txtをdir1にコピーする • dir1ディレクトリをdir2にコピーする $ mkdir dir1 $ cp hello.txt dir1 $ cp -r dir1 dir2

26.

find ファイルを探す おまけ 名前やサイズなどの条件でファイル・ディレクトリを探します. # txtファイルを表示 $ find . -type f -name "*.txt" ./dir2/hello.txt ./dir1/hello.txt ./hello.txt -type f ファイルを対象 -type d ディレクトを対象 -name "*.pdf" -size +1M 拡張子で指定 サイズが1M以上 # 過去のLTの資料を探してみる $ find ~/Documents -name "*LT*.key" /Users/asusn/Documents/Security/セキュリティキャンプ/ネクストキャンプ 2019/LT大会/セキュリティ芸人ネタ̲セキュリティキャンプ2019LT.key

27.

実演③:ファイル分析 htmlファイルを分析してみる

28.

curl URLからデータ取得する URLにアクセスしてWebページを取得したり、APIを叩いたりできます. # 標準出力 $ curl https://example.com <!doctype html> <html> ... -o 保存先を指定 -O ファイル名をURL末尾で保存 -L リダイレクトを追跡 -sS 進捗を非表示にする(エラーは表示) # 画像ファイルを保存 $ curl -O https://dummyimage.com/400x300.png ※Webサイトの利用規約でクローリング等を禁止している場合があります. 自動化する際は、規約違反に該当しないかを確認しましょう.

29.

wc 行数・単語数・バイト数を表示 テキストの行数・単語数・文字数・バイト数などを数えます. (word countの略) # 行数 単語数 バイト数 $ wc index.html 46 120 1256 index.html -l 行数 -m 文字数 # 日本語で何文字か $ echo -n "こんにちは!" | wc -m 6 ※行数は改行の数を数えているため、改行がない場合は0になる

30.

sort 行を並べ替える アルファベットや数字順に並べ替えます.(デフォルトは昇順) $ echo -e "C\nB\nA" | sort A B C $ echo -e "1\n11\n2" | sort -n 1 2 11 -r 逆順(降順)にする -n 数字として並べる -u 同じ値を削除(uniq)

31.

uniq 同じ行を削除・カウントする 連続している同じ行を削除したり、カウントしたりします. (先にsortしてから使うことが多い) $ echo -e "A\nB\nB\nC\nC\nC" | uniq A B C $ echo -e "A\nB\nB\nC\nC\nC" | uniq -c 1A 2B 3C -c 同じ行をカウント

32.
[beta]
tr

文字を置き換える

文字の置き換えや削除などをします.
# ROT13
$ echo "furyy fpevcg" | tr 'a-z' 'n-za-m'
shell script
# 改行を削除
$ cat index.html | tr -d '\n'
<!doctype html><html><head>

<title>...

-d

文字を削除

-s

連続する文字を1つにまとめる

# スペースを1つに
$ echo "a a a
aaaa

a"| tr -s ' '

33.

演習③:ファイル分析 htmlファイルを分析してみる

34.

演習③ ファイル分析 example.com等のhtmlをindex.htmlとしてworkディレクトリに保存してください (1) index.htmlは何行ですか? (2) trコマンドで記号を改行(\n)に置き換えて、単語リストを作りましょう (3) 単語をアルファベット順に並べてください。一番後ろの単語は何? $ cat index.html | ???? ? 46 $ cat index.html | ????????????????????????? ? ...(略)... 7px 8 a apple Arial ...(略)...

35.
[beta]
演習③

ファイル分析

ヒント

example.com等のhtmlをindex.htmlとしてworkディレクトリに保存してください
(1) index.htmlは何行ですか?

(2) trコマンドで記号を改行(\n)に置き換えて、単語リストを作りましょう
(3) 単語をアルファベット順に並べてください。一番後ろの単語は何?

$ cat index.html | tr "< />-.,\":;=@()\!{}#" "\n" | ?????
?
...(略)...
7px
8
a
apple
Arial ...(略)...

36.
[beta]
演習③

ファイル分析

解答

example.com等のhtmlをindex.htmlとしてworkディレクトリに保存してください
(1) index.htmlは何行ですか?

(2) trコマンドで記号を改行(\n)に置き換えて、単語リストを作りましょう
(3) 単語をアルファベット順に並べてください。一番後ろの単語は何?

$ cat index.html | wc -l
46
$ cat index.html | tr "< />-.,\":;=@()\!{}#" "\n" | sort -u
...(略)...
www
You

37.

history コマンドの履歴を表示 おまけ ターミナルでこれまでに実行したコマンドの履歴を表示します. $ history 2339 cd Desktop 2340 ls 2341 mkdir shell-script 2342 echo "こんにちは" 2343 cd shell-script !! 直前のコマンドを再実行 !N 履歴N番目を再実行 $ !2342 $ echo "こんにちは" こんにちは

38.

実演④:文字列操作 historyから情報を取り出してみる

39.

head 先頭を表示する 入力の先頭(上のほう)だけを表示します. デフォルトは先頭10行を表示します. $ head -n 1 index.html <!doctype html> -n 3 先頭3行を表示

40.
[beta]
tail

末尾を表示する

入力の末尾(下のほう)だけを表示します.
デフォルトは末尾10行を表示します.
$ tail -n 1 index.html
</html>
# 10〜12行目を表示
$ cat -n index.html | head -n 12 | tail -n 3
10
body {
11
background-color: #f0f0f2;
12
margin: 0;

-n 3

末尾3行を表示

41.

cut 指定の列を取り出す テキストの一部の列を取り出します. $ cat scores.csv id,name,score 1,Taro,81 2,Asusn,96 $ cut -d , -f 2 scores.csv name Taro Asusn -f 2 2列目を取り出す -d , 区切り文字を,にする

42.
[beta]
awk

文字列や値をプログラムで操作

指定した列を取り出して、表計算のようなこともできるコマンドです.
プログラミング言語AWKを呼び出すシェルコマンド.
# historyからコマンド部分を取り出す
$ history | awk '{print $2}'
vim
ls
cat

$2

2列目を取り出す
(引数と同じ空白区切り)

-F,

区切り文字を,にする

$3+0

3列目を数字として解釈

# 90点以上の人の名前を出力する
$ awk -F, '$3+0 >= 90 {print $2}' scores.csv
Asusn

43.

演習④:コマンドTOP5 historyからよく使うコマンドランキングを作ろう

44.

演習④ コマンドTOP5 historyコマンドを使って、よく使うコマンドランキングTOP5を表示させよう 1列目には使用回数、2列目にはコマンドを表示 $ history | ??????????????????????????????????????????? ? 321 python 218 git 213 cat 199 cd 110 echo Mac $ history 1 | ... できた人は先頭列に 順位(1〜5という数字) を振ってみよう!

45.

演習④ コマンドTOP5 ヒント • historyからコマンド部分のみを取り出してみる • 同じ行をカウントしたいけど、する前にソートしたほうがいいかもしれない • カウント結果をソートで大きい順にする • 上から5行だけ表示するようにしてみる $ history | ??????????????????????????????????????????? ? 321 python 218 git 213 cat 199 cd 110 echo

46.

演習④ コマンドTOP5 解答 historyコマンドを使って、よく使うコマンドランキングTOP5を表示させよう 1列目には使用回数、2列目にはコマンドを表示 # awkを使う場合 $ history | awk '{print $2}' | sort | uniq -c | sort -nr | head -n 5 321 python 218 git 213 cat 199 cd 110 echo

47.

演習④ コマンドTOP5 解答 historyコマンドを使って、よく使うコマンドランキングTOP5を表示させよう 1列目には使用回数、2列目にはコマンドを表示 # cutを使う場合(スペースの数が異なるため tr -s でスペースを1つにする) $ history | tr -s ' ' | cut -d ' ' -f 3 | sort | uniq -c | sort -nr | head -n 5 321 python 218 git 213 cat 199 cd 110 echo

48.

演習④ コマンドTOP5 解答 historyコマンドを使って、よく使うコマンドランキングTOP5を表示させよう 1列目には使用回数、2列目にはコマンドを表示 # 順位をつける $ history | awk '{print $2}'| sort | uniq -c | sort -nr | head -n 5 | cat -n 1 321 python 2 218 git 3 213 cat 4 5 199 cd 110 echo

49.
[beta]
# awkでゴリ押す場合(普通はやりません)
演習④
コマンドTOP5

解答

$ history | history 1 | awk '
historyコマンドを使って、よく使うコマンドランキングTOP5を表示させよう
NF>=2 { c[$2]++ }
1列目には使用回数、2列目にはコマンドを表示
END {
for (i=0; i<5; i++) {
max = -1; key = ""
for (k in c) if (c[k] > max) { max = c[k]; key = k }
if (max < 0) break
printf "%d %s\n", max, key
delete c[key]
}
}'

50.

正規表現に慣れる

51.

脆弱エンジニアの日常 ターミナルトーク シェルのbashとお話しできる人気アトラクション

52.

正規表現 早見表 事前課題の「正規表現パズル」よりおさらい https://gametsukurukun.com/regexp-puzzle/

53.

実演⑤:文字列検索 セキュリティ・キャンプ講師の情報を抽出

54.
[beta]
grep

文字列で検索する

文字列を含む行を表示します.
検索文字列には正規表現を指定できます.
# カラーコードを検索
$ grep -E "#[0-9a-f]{6}" index.html
background-color: #fdfdff;
color: #38488f;

-v

含まない行を表示

-o

マッチした部分のみを表示

-i

大文字・小文字を区別しない

-r

ディレクトリの中をまとめて検索

-C 5

# ディレクトリ内の<title>タグを探す
-E
$ grep -rn "<title>" .
./index.html:4: <title>Example Domain</title>
./camp.html:17:<title>セキュリティ・キャンプ2025</title>

前後5行も表示
拡張正規表現

55.

演習⑤ 講師のXアカウントID セキュリティ・キャンプ2025 ジュニアの講師紹介ページをcamp.htmlとして workディレクトリに保存してください https://www.ipa.go.jp/jinzai/security-camp/2025/camp/junior/profile.html そこからXのアカウントIDだけを出力してください $ cat camp.html | ???????????????????????????????? ? @uchan̲nos @AsuNa̲jp @asusn̲online @̲nosita @k̲ibuta

56.

演習⑤ 講師のXアカウントID ヒント • @でgrepしてみる • 他のやつがヒットしてしまうので、それとの違いでさらにgrepする • grepにマッチした部分のみを表示できるオプションなかったっけ? $ cat camp.html | ???????????????????????????????? ? @uchan̲nos @AsuNa̲jp @asusn̲online @̲nosita @k̲ibuta

57.

演習⑤ 講師のXアカウントID 解答 セキュリティ・キャンプ2025 ジュニアの講師紹介ページをcamp.htmlとして workディレクトリに保存してください https://www.ipa.go.jp/jinzai/security-camp/2025/camp/junior/profile.html そこからXのアカウントIDだけを出力してください $ cat camp.html | grep "</p>" | grep -o "@[0-9a-zA-Z̲]*" @uchan̲nos @AsuNa̲jp @asusn̲online @̲nosita @k̲ibuta

58.

実演⑥:文字列編集 example.comの見出しを書き換える

59.
[beta]
sed

文字列を編集する

文字列を置き換えたり削除したりできます.(stream editorの略)
置換文字列には正規表現を指定できます.
$ echo "ちち" | sed 's/ち/は/'
はち
$ echo "ちち" | sed 's/ち/は/g'
はは

sed 's/<br>/\n/g'
sed -E
sed 's|//|/|g'

# タグの中身を取り出す
$ echo "<h1>タイトル</h1>" | sed -E 's|<h1>(.*)</h1>|\1|'
タイトル

<br>を改行に置換
(g: 行の中全てを置換)
拡張正規表現
//を/に置換
(区切り文字は/以外も可)

60.

演習⑥ 講師のXアカウントURL セキュリティ・キャンプ2025 ジュニアの講師紹介ページから、講師のXのプロ フィールページへのURLを出力してください $ cat camp.html | grep "</p>" | grep -o ?"@[0-9a-zA-Z̲]*" |\ sed "s|@|https://x.com/|" ? https://x.com/uchan̲nos https://x.com/AsuNa̲jp https://x.com/asusn̲online https://x.com/̲nosita https://x.com/k̲ibuta

61.

演習⑥ 講師のXアカウントURL ヒント 演習⑤のidを取り出すところまではそのまま使っちゃっていいです $ cat camp.html | grep "</p>" | grep -o "@[0-9a-zA-Z̲]*" |\ sed "s|@|https://x.com/|" ? https://x.com/uchan̲nos https://x.com/AsuNa̲jp https://x.com/asusn̲online https://x.com/̲nosita https://x.com/k̲ibuta

62.

演習⑥ 講師のXアカウントURL 解答 セキュリティ・キャンプ2025 ジュニアの講師紹介ページから、講師のXのプロ フィールページへのURLを出力してください $ cat camp.html | grep "</p>" | grep -o "@[0-9a-zA-Z̲]*" |\ sed "s|@|https://x.com/|" https://x.com/uchan̲nos https://x.com/AsuNa̲jp https://x.com/asusn̲online https://x.com/̲nosita https://x.com/k̲ibuta

63.

xargs すべての行に対して実行する 入力で受け取った各行をコマンドの引数としてまとめて渡します. たくさんのファイル名を一気に処理したいときに便利です. # すべてのtxtファイルをVSCodeで開く $ ls **/*.txt | xargs code おまけ -I {} 受け取った1項目を {} に置換して実行 -P 5 同時に5並列で実行 # pythonの処理を5プロセスで並列で実行する $ cat list.txt | xargs -I {} -P 5 python process.py {}

64.

Gitコマンドに慣れる

65.

PR作成大会をやります この間違いだらけのリポジトリにPRを1人2回出してもらいます https://github.com/asusn-online/asusn-wikipedia

66.

PR作成チャレンジ① クローン # ダウンロードしたい場所に移動してクローン $ cd ~/Desktop $ git clone [email protected]:asusn-online/asusn-wikipedia.git

67.

PR作成チャレンジ① ブランチの作成 作業用のブランチを作成します。 ブランチ名は他の人と被らないよう簡潔に! # ブランチの確認 $ git branch # ブランチの作成 $ git branch <branch名> # ブランチの切り替え $ git switch <branch名>

68.

PR作成チャレンジ① 変更をコミット VSCodeなどでコードを変更しましょう! # 変更差分の確認 $ git diff # コミットしたい変更をステージング $ git add <ファイル名> # コミット $ git commit -m "<メッセージ>" # コミット履歴の確認 $ git log

69.

PR作成チャレンジ① ブランチをpush ブランチをリモートにpushします! # ブランチをpush $ git push origin <branch名> ←これを開くとPRが 作成できます

70.

PR作成チャレンジ① PRを作成 マージ先ブランチを確認して作成します 作成したらレビュー者にレビューを依頼しましょう!

71.

PR作成チャレンジ① PRをマージ LGTMをもらったらマージします

72.

PR作成チャレンジ① ローカルを最新化 ローカルのmainを最新の状態にしましょう # mainブランチに切り替え $ git switch main # リモートをfetch $ git fetch origin main # ローカルのmainにリモートを取り込む $ git merge origin/main # マージされたブランチを削除 $ git branch -d <branch名>

73.

PR作成チャレンジ① ローカルを最新化 ローカルのmainを最新の状態にしましょう # mainブランチに切り替え $ git switch main # リモートをfetch $ git fetch origin main # ローカルのmainにリモートを取り込む $ git merge origin/main # マージされたブランチを削除 $ git branch -d <branch名>

74.

PR作成チャレンジ① ローカルを最新化 ローカルのmainを最新の状態にしましょう # mainブランチに切り替え $ git switch main # リモートをfetch $ git fetch origin main # ローカルのmainにリモートを取り込む $ git merge origin/main # マージされたブランチを削除 $ git branch -d <branch名>

75.

PR作成チャレンジ① ローカルを最新化 ローカルのmainを最新の状態にしましょう # mainブランチに切り替え $ git switch main # リモートをfetch $ git fetch origin main # ローカルのmainにリモートを取り込む $ git merge origin/main # マージされたブランチを削除 $ git branch -d <branch名>

76.

PR作成チャレンジ② ブランチの作成 最新化した状態で再度PRを作りましょう 2回目は省略形のコマンドを使ってみます! # ブランチの確認 $ git branch # ブランチを作成して切り替え $ git switch -c <branch名>

77.

PR作成チャレンジ② 変更をコミット VSCodeなどでコードを変更しましょう! # 変更差分の確認 $ git diff # コミットしたい変更をステージング $ git add <ファイル名> # コミット $ git commit -m "<メッセージ>" # コミット履歴の確認 $ git log

78.

PR作成チャレンジ② ブランチをpush ブランチをリモートにpushします! # ブランチをpush $ git push origin <branch名> 1回目と同様にPRを作成して LGTMをもらったらマージをしてください

79.

PR作成チャレンジ② ブランチをpush ブランチをリモートにpushします! # ブランチをpush $ git push origin <branch名> 1回目と同様にPRを作成して LGTMをもらったらマージをしてください

80.

PR作成チャレンジ② ローカルを最新化 ローカルのmainを最新の状態にしましょう # mainブランチに切り替え $ git switch main # リモートのmainを取り込む $ git pull origin main # マージされたブランチを削除 $ git branch -d <branch名>

81.

PR作成チャレンジ② ローカルを最新化 ローカルのmainを最新の状態にしましょう # mainブランチに切り替え $ git switch main # リモートのmainを取り込む $ git pull origin main # マージされたブランチを削除 $ git branch -d <branch名>

82.

PR作成チャレンジ② ローカルを最新化 ローカルのmainを最新の状態にしましょう # mainブランチに切り替え $ git switch main # リモートのmainを取り込む $ git pull origin main # マージされたブランチを削除 $ git branch -d <branch名>

83.

⚠ GitHubでの注意点 APIキーやトークンなどの大事なものは絶対にpushしないようにしましょう! ❌ API̲KEY = "xxxx-super-secret-key-xxxx" ⭕ SUPER̲API̲KEYという環境変数に値を保存して API̲KEY = os.getenv("SUPER̲API̲KEY") のように呼ぶ pushした途端、GitHub上のコードをクローリングしている悪意のあるbotに APIが叩かれまくって、すごい額使われたりしてしまいます. pushしてしまった場合は、まずキーやトークンを無効にし、再発行しましょう

84.

コマンドを作る!

85.

簡単なコマンドの作り方 historyランキングをコマンドにしてみよう # historyランキングTOP5 $ history | awk '{print $2}'| sort | uniq -c | sort -nr | head -n 5 | cat -n 1 2 3 4 5 327 python 271 cat 218 git 201 cd 160 echo

86.

簡単なコマンドの作り方 functionで関数化します $ function history-top() { history | awk '{print $2}'| sort | uniq -c | sort -nr | head -n 5 | cat -n } $ history-top 1 327 python 2 271 cat 3 218 git 4 201 cd 5 160 echo

87.

簡単なコマンドの作り方 引数で上位いくつを表示するかを指定できるようにしてみましょう! $ function history-top() { history | awk '{print $2}'| sort | uniq -c | sort -nr | head -n $1 | cat -n } $ history-top 3 1 327 python 2 271 cat 3 218 git

88.

簡単なコマンドの作り方 シェルを再起動しても消えないように ~/.bashrc に以下を追記します. function history-top() { history | awk '{print $2}'| sort | uniq -c | sort -nr | head -n $1 | cat -n } $ history-top 3 1 327 python 2 271 cat 3 218 git 完成! ※zshの場合は ~/.zshrc

89.

自分だけのコマンドを 作ってみましょう!

90.

自作コマンドのアイデア 自分が普段面倒だと思うことをコマンドで自動化してみましょう! • CSVをmarkdownの表に変換するコマンド • プロジェクトを新規作成してgit initしてくれるコマンド • 音声と静止画から動画にしてくれるコマンド • GPTにコードなどを全部投げるために、ディレクトリ構造やファイル名と中 身をクリップボードにコピーするコマンド • アルファベットをdiscordスタンプに変換するコマンド • $ emoji hello →

91.

本格的なコマンドの作り方 実際のコマンドがどんな感じかを見てみましょう(/bin, /usr/bin など)

92.

本格的なコマンドの作り方 コマンド名をファイルとするシェルスクリプトを作ります. # コマンドを入れておくディレクトリ作成 $ mkdir ~/myCommand # ~/myCommand/hello としてシェルスクリプトを作成 #!/usr/bin/env bash echo "Hello $1!" # 実行してみると以下のような引数にHelloしてくれるというコマンド $ bash ~/myCommand/hello world Hello world!

93.

本格的なコマンドの作り方 # 実行可能にする $ chmod +x ~/myCommand/hello myCommand以下のコマンドを実行してもらえるようにパスを通します. # コマンドのパスを通す $ echo 'export PATH="$HOME/myCommand:$PATH"' >> ~/.bashrc $ source ~/.bashrc # パスが通った $ which hello /Users/asusn/myCommand/hello ※zshの場合は ~/.zshrc

94.

本格的なコマンドの作り方 完成!!! $ hello seccamp Hello seccamp!

95.

シェルスクリプト(文字列・変数) ここまで実行してきたコマンドを並べて .sh という拡張子で保存すれば、シェ ルスクリプトになります. # シェルスクリプトの実行方法 $ bash script.sh シェルでさらに役に立つテクニックをいくつか紹介していきます. # コマンド置換 $() $ echo "$(pwd) にいるよ" /Users/asusn/Desktop/work にいるよ # 変数 $ age=42 $ echo $age 42 # 文字列の結合 $ msg="歳です" $ echo $arg$msg 42歳です

96.

chmod 読み・書き・実行の権限を変える ファイル・フォルダの権限を変更します. # ファイルを作成しても実行権限がない $ ls -l script.sh -rw-r--r--@ 1 asusn staff ... script.sh $ chmod +x script.sh $ ls -l script.sh -rwxr-xr-x@ 1 asusn staff ... script.sh # 以下でも実行可能になる $ chmod 755 script.sh +r 読めるようにする +w 書けるようにする +x 実行権限 # 読み込み専用にする $ chmod 644 secret.txt

97.

シェルスクリプト(if文・for文) if文やfor文は以下のように書けます. file="secret.txt" if [ -e $file ] then echo "$file があるよ" for file in $(ls) do echo "$file があるよ" else echo "$file がないよ" dir1 があるよ dir2 があるよ fi secret.txt がないよ done hello.txt があるよ

98.

シェルスクリプト 自分がとりあえず冒頭にいつも書くやつ #!/usr/bin/env bash set -euo pipefail # 引数チェック if [ $# != 1 ]; then echo "helloする相手を指定してください" echo "$0 <arg1>" exit 1 fi echo "Hello $1!" set -e 失敗したら即終了 set -u 未定義変数の参照を エラーとする set -x デバッグ表示 set -o pipefail パイプでどこか失敗した ら全体を失敗扱い

99.

その他便利コマンド紹介 (インストール必要なものも含む)

100.

tree ディレクトリ構成を木構造で表示 ディレクトリとファイルを木構造で表示します. $ tree work work ├── dir1 │ └── hello.txt ├── dir2 │ └── hello.txt └── hello.txt 3 directories, 3 files

101.
[beta]
jq

JSONの整形

JSON形式のデータを整形・抽出します.
$ echo '{"name":"asusn","age":28}' | jq
{

}

"name": "asusn",
"age": 28

$ echo '{"name":"asusn","age":28}' | jq -r '.name'
asusn

102.

Mac Win Linux pbcopy / clip / xclip クリップボードへコピー 入力テキストをクリップボードに入れます. pbpasteでクリップボードの内容を出力します. # sshの公開鍵をクリップボードのコピー $ cat ~/.ssh/id̲ed25519.pub | pbcopy # クリップボードの中身をソートして出力 $ pbpaste | sort

103.

magick 画像を変換する 画像の形式変換やリサイズ・切り抜き・回転等をします(旧convertコマンド) # png -> jpgに変換 $ magick 400x300.png 400x300.jpg # 1280x720にリサイズする(!はアスペクト比を維持しない) $ magick 400x300.png -resize 1280x720! out.png # 中心から200x200に切り抜き $ magick 400x300.png -gravity center -crop 200x200+0+0 out200.png

104.

ffmpeg 動画を編集する 動画・音声の変換・切り抜き・結合・合成などをします. # MOVファイルをmp4に変換 $ ffmpeg -i cap.MOV -pix̲fmt yuv420p output.mp4 # 動画の音声を無音に $ ffmpeg -an -i input.mp4 output.mp4 # 動画を10fpsで画像シーケンスに出力する $ ffmpeg -i test.mp4 -vcodec png -r 10 image̲%03d.png

105.

sox 音声を変換・合成する 音声の変換・生成・切り取り・結合・合成などをします. # 音量調整 $ sox in.mp3 out.mp3 gain -25 # 3秒の無音ファイルを生成 $ sox -n -r 44100 -b 16 -c 1 silence.wav trim 0 3 # ナレーションにBGMを合成する $ sox -m voice.wav bgm.wav mix.wav

106.

おわりに

107.

gitについてもっと知りたいあなたへ Webで読めます→ https://git-scm.com/book/ja/v2

108.

さらに極めたいあなたへ

109.

さらにさらに極めたいあなたへ