Bash
Zsh
Linux
UNIX

仕事で使えるLinux ワンライナー集

index.jpeg

愛用しているワンライナー
特にきれいにまとめてる系の記事ではない

背景

個人的に愛用しているワンライナーコマンド集
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でも実行することが出来るらしい

windows版Fork爆弾
> for /l %a in (0,0,0) do start

まとめ

いろいろ追記してたらただのコマンド集的な感じになった。
ジャンル分けするのはめんどいのでやってない。
(そもそもがメモ帳からのコピペまんま)
綺麗にいい感じにまとまってるサイトあったら教えてください。

参考リンク

https://qiita.com/toyohama/items/455b786e775ca60c2704
https://qiita.com/todays-mitsui/items/5c58b2a808b4a31f14e1

Fork爆弾
https://ja.wikipedia.org/wiki/Fork%E7%88%86%E5%BC%BE

  • AWKつかうやつ
  • 危険なシェル芸
  • まとめ
  • 参考リンク