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

![index.jpeg](https://qiita-image-store.s3.amazonaws.com/0/258841/51840aa0-94f6-9a46-c443-0efc611791c5.jpeg)


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

## 背景

個人的に愛用しているワンライナーコマンド集
aliasが許されない共用マシンとかで実行するときに見る用

シェル芸人への憧れ強め。全ての作業を1発で終わらせる姿には感動。
洗練された無駄の無い技術はかっこいいですね。

シェル芸人さんのような作品とは程遠いけど色々使っていく中で便利だと思ったワンライナー集
シェル芸人については下記をご参照ください
http://www.usptomo.com/PAGE=20101025WHATS

シェル芸人への道への第一歩として読むのにいい記事があったのでこちらもご紹介
https://qiita.com/t_nakayama0714/items/bfe4852e0535858ee662

UNIX哲学は大変興味深いですね。
下記も結構面白かったのでお時間ある方は是非ご覧ください。
https://futurismo.biz/archives/1500/

## ワンライナー

#### 一つ前のディレクトリへ戻る

``` bash
$ cd -
```

めちゃくちゃ使うのに意外と入門書に載ってないやつ。

#### スクリプトが置かれている場所の絶対パスとスクリプト名を取得

``` bash
$ echo $(cd $(dirname $0) && pwd)/$(basename $0)
```

スクリプト内でフルパスが欲しいときって意外とあるから使うやつ

#### 物理メモリを多く使用しているプロセスを抽出

``` bash
$ ps aux | sort -n -k 6 | tail -n 10
```

#### CPU使用率が高いプロセスを見つける

``` bash
$ vmstat 1 | awk '{print strftime("%y/%m/%d %H:%M:%S"), $0}'
```

#### ヘッダーとフッターを除外して表示

``` bash
$ cat ファイル名 | sed -e '$d' | awk 'NR > 1 {print}'
```

#### 任意のディレクトリ以下のファイルを検索

``` bash
$ find ./ -name '*'|xargs grep 'xxx'
```

#### ファイルを空にする

``` bash
$ cat /dev/null > sample.txt
```

一々テキストエディタ開いて削除とかいらない便利なやつ
/dev/nullについては下記をご参照ください
https://ja.wikipedia.org/wiki//dev/null

#### ディレクトリ作成後そこへ移動

``` bash
$ mkdir dir_name ; cd $_
```

#### 文字コード変換

``` bash
$ perl -MEncode -pe '$_ = encode("utf8", decode("eucjp", $_))' eucjp.txt > utf.txt
```

#### Listen中のポート一覧

``` bash
$ lsof -Pan -i tcp -i udp
```

ssでもいい気がするがこっちも

#### 指定したポートを使ってるプロセスをkill

``` bash
$ lsof -i :8080 | awk '{l=$2} END {print l}' | xargs kill
```

#### 任意のディレクトリのファイル数をカウント

``` bash
$ ls -F |grep -v / |wc -l
```

試験的に作ったディレクトリを数えるために使えるやつ

#### 指定ディレクトリ配下のファイルのパーミッションを見る

``` bash
$ find . -printf "%U %G %m %p\n"
```

#### バックアップ的なやつ

``` bash
$ cp passwd{,.bak}
```

#### パスの最後のスラッシュを削除(じゃなければ何もしない)

``` bash
$ MYDIR=${MYDIR%/}
```

#### ディレクトリサイズが大きい順で表示

``` bash
$ du -m / --max-depth=3 --exclude="/proc*" | sort -k1 -n -r
```

#### 拡張子を一括変換

``` bash
$ for filename in *.txt; do mv $filename ${filename%.txt}.txt.old; done
```

txtからtxt.oldへ変換する

#### パスワードをランダム生成する

``` bash
$ head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo ''
```

テストユーザとかのパスワードが必要なときにとりあえず

#### 連番ファイルの作成

``` bash
$ touch foo_{1..30}.txt
$ touch {A..Z}.txt
```

#### 定期的にコマンドを実行

``` bash
$ while true; do `sleep 1; say hello`; done
```

#### ファイル名を指定してファイルを保存する curl

``` bash
$ curl -o foo.txt https://hoge.com/fuga.txt -o bar.txt https://piyo.com/hogera.txt
```

#### sortとuniqのイディオム

``` bash
$ .. | sort | uniq -c | sort -nr
```

#### .DS_storeを一括削除

``` bash
$ find . -name '.DS_Store' -type f -ls -delete
```

憎きDS_Storeの一括削除

#### 並列化してxargs

``` bash
echo "aaa" "iii" | xargs -r -n 1 -P 2 echo "Output:"
```

forでは不可能な並列実行を行う

#### ストップウォッチ的なやつ

``` bash
$ time read
```

Ctrl + Dを押したら止まる。

#### シスログを時間指定で見る

``` bash
$ awk -F - '"開始時間" < $1 && $1 <= "終了時間"' /抽出を行うログのPATH
```

#### 文字列を抜き出す

``` bash
$ echo 'abcde' | awk '{print substr($0, 2)}'
```

#### あるディレクトリ配下のファイルを一括コピー

``` bash
$ for txt in $(find . -name *.txt); do cp -ip ${txt} ~/work/ ; done
```

#### 定期的にプロセス状態を監視

``` bash
$ while true ; do ps aux | grep httpd ; echo ""; sleep 2 ; done ;
```

watchあるならそっちでも。ログ見やすいから個人的にはこっち

#### タイムスタンプつきでtailf

``` bash
tailf file | while read; do echo "$(date +%T.%N) $REPLY"; done
```

#### 表示整形 column

``` bash 
$ mount | column -t
```

セパレータを指定することもできる

#### grepする時間を指定して出力がなければエラー終了

``` bash
$ timeout 5 tailf hoge.txt | grep -q --line-buffered "hoge"
```

#### ユーザ毎のCPU使用率を見る

``` bash
$ ps aux | awk '{ if(NR>1){p[$1] += $3; n[$1]++ }}END{for(i in p) print p[i], n[i], i}'
```

## AWKつかうやつ

#### 文字数/単語数をカウントする

``` bash
# 文字数カウント(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
```

#### 指定行から指定行まで表示

``` bash
$ awk 'NR==10,NR==20'
```

#### 奇数/偶数行のみ表示

``` bash
# 奇数行
$ awk 'NR%2' filename

# 偶数行
$ awk 'NR%2==0' filename
```

#### プロセス名で一括kill

``` bash
$ kill `ps -aux | grep "プロセス名" | awk '{print $2;}'`
```

## 危険なシェル芸

世の中には実行すべきではないシェル芸も存在する。
それがこのfork爆弾だ。

``` bash
$ :(){ :|:& };:
```

たった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