LoginSignup
0
1

今年自分が初めて知った小技やtipsをまとめてみた

Last updated at Posted at 2023-12-21

概要

年末なので、今年1年間で初めて知った小技やテクニックをまとめてみました。軽い読み物として見て頂き、「こんなのあるんだ!」と思ってもらえたら幸いです。

Shell script

$'\t'(タブの表現)

タブ文字を直接打つ他にも、$'\t'と表現できます

test.tsv
aaa bbb
123 456
awk -F $'\t' '{print $2}' test.tsv

awkでtsvを読む

awkのオプション-Fにタブ文字を指定します

awk -F $'\t' '{print $2}' test.tsv

|&(標準出力とエラー出力両方をパイプで渡す)

下記は、標準出力とエラー出力を標準出力とファイルへ書き込みます

./sample.sh |& tee stdout_stderr.log

ImageMagickで サムネイルを作る

横500px、縦180pxのサムネイルを生成します。

convert -define jpeg:size=500x180 test.jpg \
  -auto-orient -thumbnail 500x500 -unsharp 0x.5 test_thumbnail.jpg

parallelで並列処理

上記のサムネイル生成コマンドを並列処理します。

# とある場所に画像のみを格納しているディレクトリがあるとします。
cd path/to/image_dir

find . -type f -print0 | parallel --null \
  convert -define jpeg:size=500x180 {} \
  -auto-orient -thumbnail 500x500 -unsharp 0x.5 {}_thumbnail.jpg 2>>../err.log

テキストファイルの改行コードを変更(CRLF -> LF)

sedは処理結果を標準出力に出力しますが、オプション-iを使用することで読み込んだファイルに出力できます(上書き保存)。

target.txt
a
b
c
od -c target.txt
# 下記が出力される
# 0000000   a  \r  \n   b  \r  \n   c  \r  \n
# 0000011
# \r\n -> \n
sed -i -z 's/\r\n/\n/g' target.txt
od -c target.txt
# 下記が出力される
# 0000000   a  \n   b  \n   c  \n
# 0000006

ssh越しにtar.gzファイルを渡す

下記事象が重なっている状況があり、このコマンドは重宝しました。

  • リモートサーバのストレージが枯渇しているが、圧縮ファイルなら置けそう
  • ローカルのストレージも枯渇しており、手元にtarアーカイブを作成できない
  • リモートサーバでは、rsyncなどを勝手にインストールできない
tar zcf - target_dir/ | ssh my_server.example.com "cat >target_dir.tar.gz"

長時間接続していると、sshがtimeoutしてしまうので対策したコマンド

tar zcf - target_dir/ |
  ssh -o TCPKeepAlive=yes -o ServerAliveInterval=60 -o ServerAliveCountMax=3 \
  user@my_server.example.com "cat >target_dir.tar.gz"

ファイルリストからtarアーカイブを作成

tarコマンドにて、--files-fromオプションを指定して、圧縮したいファイルのパスを記述したファイルを指定して圧縮できます。

# サンプルとして下記ファイルを作成
mkdir test
touch file1.txt test/file2.txt

# ファイルリストを作った
cat files.txt 
# file1.txt
# test/file2.txt

tar zcf target_dir.tar.gz --files-from files.txt

ext4では*\もファイル名として使用可能

ext4(Linuxで採用されているファイルシステム)では、ファイル名にNULL(\0)と/以外の文字を使用できます。

touch '*' '\'

# 他にもこんなものも使用可能
touch '|' '>' '<' '?'

# 制御文字も?

ここで、ファイル名としての'*'と、ワイルドカードとしての*に注意してください。ファイル名ならクォーテーションで囲みます。下記はディレクトリ'*'以下のファイルを出力したい時のコマンドです。

mkdir '*'
cd '*'
touch file1 file2 file3
cd ../

echo '*'/*
# 出力例: */file1 */file2 */file3

Sqlite3

sqlite3には、システムの運用・保守をやっていて、マスタ系データの整備などで使用しました。csvやらtsvやら、表データをサクッと管理したいときにかなり助けてもらいました。

csvをsqlite3に取り込む

ヘッダーのあるCSVを取り込みます。

sqlite3 -separator ',' "db.sqlite3" ".import 'data.csv' items"
# ここで、 data.csv は取り込みたいcsvファイル名、itemsは新規作成するテーブル名

sqlite3 "db.sqlite3" "SELECT * FROM items limit 10"

文字コードがshift-jisのCSVファイルを取り込む場合は、iconvで変換し、標準入力経由で取り込むことができます。

iconv -f cp932 -t utf-8 shift-jis-data.csv |
  sqlite3 -separator ',' "db.sqlite3" ".import '| cat -' items"

サーバ

秘密鍵から公開鍵生成

特定の鍵でgit cloneなどを行えるよう、CodeCommitやらGithubやらに公開鍵を登録したい時がありました。しかしその鍵は秘密鍵しかなく、どうしようと思った時に調査して知ったコマンドです。

ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub

公開鍵からフィンガープリント出力

例えば、authorized_keysの一番上の公開鍵に対するフィンガープリントを出力するコマンドです。

head -n 1 ~/.ssh/authorized_keys | tail -n 1 | ssh-keygen -lf -

Windows

Windows時間(NT タイムエポック)

Unix時間、エポック秒などは聞いたことありましたが、Windowsは別にあるんですね。

Unix タイムスタンプでは、1970年1月1日0時0分0秒からの秒数で表されているタイムスタンプですが、Windows では、1601年1月1日0時0分からの100ナノ秒単位で表されています。

以上です。

0
1
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1