愛用しているワンライナー
特にきれいにまとめてる系の記事ではない
背景
個人的に愛用しているワンライナーコマンド集
aliasが許されない共用マシンとかで実行するときに見る用
シェル芸人への憧れ強め。全ての作業を1発で終わらせる姿には感動。
洗練された無駄の無い技術はかっこいいですね。
シェル芸人さんのような作品とは程遠いけど色々使っていく中で便利だと思ったワンライナー集
シェル芸人については下記をご参照ください
http://www.usptomo.com/PAGE=20101025WHATS
シェル芸人への道への第一歩として読むのにいい記事があったのでこちらもご紹介
https://qiita.com/t_nakayama0714/items/bfe4852e0535858ee662
UNIX哲学は大変興味深いですね。
下記も結構面白かったのでお時間ある方は是非ご覧ください。
https://futurismo.biz/archives/1500/
ワンライナー
一つ前のディレクトリへ戻る
$ cd -
めちゃくちゃ使うのに意外と入門書に載ってないやつ。
スクリプトが置かれている場所の絶対パスとスクリプト名を取得
$ echo $(cd $(dirname $0) && pwd)/$(basename $0)
スクリプト内でフルパスが欲しいときって意外とあるから使うやつ
物理メモリを多く使用しているプロセスを抽出
$ ps aux | sort -n -k 6 | tail -n 10
CPU使用率が高いプロセスを見つける
$ vmstat 1 | awk '{print strftime("%y/%m/%d %H:%M:%S"), $0}'
ヘッダーとフッターを除外して表示
$ cat ファイル名 | sed -e '$d' | awk 'NR > 1 {print}'
任意のディレクトリ以下のファイルを検索
$ find ./ -name '*'|xargs grep 'xxx'
ファイルを空にする
$ cat /dev/null > sample.txt
一々テキストエディタ開いて削除とかいらない便利なやつ
/dev/nullについては下記をご参照ください
https://ja.wikipedia.org/wiki//dev/null
ディレクトリ作成後そこへ移動
$ mkdir dir_name ; cd $_
文字コード変換
$ perl -MEncode -pe '$_ = encode("utf8", decode("eucjp", $_))' eucjp.txt > utf.txt
Listen中のポート一覧
$ lsof -Pan -i tcp -i udp
ssでもいい気がするがこっちも
指定したポートを使ってるプロセスをkill
$ lsof -i :8080 | awk '{l=$2} END {print l}' | xargs kill
任意のディレクトリのファイル数をカウント
$ ls -F |grep -v / |wc -l
試験的に作ったディレクトリを数えるために使えるやつ
指定ディレクトリ配下のファイルのパーミッションを見る
$ find . -printf "%U %G %m %p\n"
バックアップ的なやつ
$ cp passwd{,.bak}
パスの最後のスラッシュを削除(じゃなければ何もしない)
$ MYDIR=${MYDIR%/}
ディレクトリサイズが大きい順で表示
$ du -m / --max-depth=3 --exclude="/proc*" | sort -k1 -n -r
拡張子を一括変換
$ for filename in *.txt; do mv $filename ${filename%.txt}.txt.old; done
txtからtxt.oldへ変換する
パスワードをランダム生成する
$ head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo ''
テストユーザとかのパスワードが必要なときにとりあえず
連番ファイルの作成
$ touch foo_{1..30}.txt
$ touch {A..Z}.txt
定期的にコマンドを実行
$ while true; do `sleep 1; say hello`; done
ファイル名を指定してファイルを保存する curl
$ curl -o foo.txt https://hoge.com/fuga.txt -o bar.txt https://piyo.com/hogera.txt
sortとuniqのイディオム
$ .. | sort | uniq -c | sort -nr
.DS_storeを一括削除
$ find . -name '.DS_Store' -type f -ls -delete
憎きDS_Storeの一括削除
並列化してxargs
echo "aaa" "iii" | xargs -r -n 1 -P 2 echo "Output:"
forでは不可能な並列実行を行う
ストップウォッチ的なやつ
$ time read
Ctrl + Dを押したら止まる。
シスログを時間指定で見る
$ awk -F - '"開始時間" < $1 && $1 <= "終了時間"' /抽出を行うログのPATH
文字列を抜き出す
$ echo 'abcde' | awk '{print substr($0, 2)}'
あるディレクトリ配下のファイルを一括コピー
$ for txt in $(find . -name *.txt); do cp -ip ${txt} ~/work/ ; done
定期的にプロセス状態を監視
$ while true ; do ps aux | grep httpd ; echo ""; sleep 2 ; done ;
watchあるならそっちでも。ログ見やすいから個人的にはこっち
タイムスタンプつきでtailf
tailf file | while read; do echo "$(date +%T.%N) $REPLY"; done
表示整形 column
$ mount | column -t
セパレータを指定することもできる
grepする時間を指定して出力がなければエラー終了
$ timeout 5 tailf hoge.txt | grep -q --line-buffered "hoge"
ユーザ毎のCPU使用率を見る
$ ps aux | awk '{ if(NR>1){p[$1] += $3; n[$1]++ }}END{for(i in p) print p[i], n[i], i}'
AWKつかうやつ
文字数/単語数をカウントする
# 文字数カウント(wc -c)
$ awk '{n+=length($0)} END{print n}' filename
# 単語数カウント(wc -w)
$ awk '{n+=NF} END{print n}' filename
# 行数カウント(wc -l)
$ awk 'END{print NR}' filename
指定行から指定行まで表示
$ awk 'NR==10,NR==20'
奇数/偶数行のみ表示
# 奇数行
$ awk 'NR%2' filename
# 偶数行
$ awk 'NR%2==0' filename
プロセス名で一括kill
$ kill `ps -aux | grep "プロセス名" | awk '{print $2;}'`
危険なシェル芸
世の中には実行すべきではないシェル芸も存在する。
それがこのfork爆弾だ。
$ :(){ :|:& };:
たった13文字でFork爆弾として機能する凄いやつ。
実行した瞬間からfork(2)を実行しその子プロセスもfork(2)を実行。
プロセステーブルを埋め尽くしkillすることも出来なくする恐ろしいコマンド。
基本的には実行したら最後でOSの再起動しか対処方法は無いといわれている。
ちなみにwindowsでも実行することが出来るらしい
> for /l %a in (0,0,0) do start
まとめ
いろいろ追記してたらただのコマンド集的な感じになった。
ジャンル分けするのはめんどいのでやってない。
(そもそもがメモ帳からのコピペまんま)
綺麗にいい感じにまとまってるサイトあったら教えてください。
参考リンク
https://qiita.com/toyohama/items/455b786e775ca60c2704
https://qiita.com/todays-mitsui/items/5c58b2a808b4a31f14e1