シェルのコマンド例記録

参考になったコマンド

## a~gまで出力して、field numberが4以上だと、3連番する
$ echo {a..g} | xargs -n 1 | awk 'NR>=4{print $1, $1, $1}NR<4{print $1, $1}'

## 80ポートのtcp udpの確認
$ grep '80/[tu][cd]p' /etc/services

## 出現文字列の種類を確認
$ cat test.txt |sed 's/./&\n/g' | sort | uniq

## 時間指定で、ファイルを抽出する方法 -t 時間順 -r リバース 
$ ls -ltr --full-time | awk -v "d=$(date -d '10 days ago' +%Y-%m-%d)" 'd<=$6'

## 階層指定(maxdepth)で10日前(0時を出発)までの更新ファイルの検出
$ find . -daystart -maxdepth 1 -mtime -10

## uploadsからworkに、1日以上まえのファイルを移動させる
$ find uploads/ -maxdepth 1 -daystart -mtime +0 | xargs -I@ mv @ work/

## 以後エラー出力をファイルに吐き出す
$ exec 2> file

## user1にuser変更
$ sudo -u -i user1

## test.txtの2列目(-k2,2)で数字順(-n)安定(-s)ソートする
$ sort -k2,2n -s test.txt

## 文字コードの判別
$ nkf -g shift_jis.txt
Shift_JIS

## 文字コードをShift_JISに変換
$ cat -e 'あい\nうえお' | nkf -sLwx > shift_jis.txt

## バイナリファイルを16進数ずつ引き剥がし(xxd -p)、nバイトに改行を入れる(fold -b<n>)
$ xxd -p shift_jis.txt | fold -b2

## 頭に16進数の0xをつける
$ cat tmp | fold -b2 | sed 's/^/0x/'

## string.txtに記載されたキーワードがtarget.txtにあるか判定して、exam.csvに記録
$ for i in `cat string.txt`; do if grep -q $i target.txt; then echo $i,O; else echo $i,X; fi ; done > exam.csv

## ディスク容量の確認
$ df -h
$ du -h --max-depth=1 / | grep G

## メモリの確認
$ free -h

## アクセスの集計確認
$ for F in `ls access_log.20180*`; do echo "$(zcat -f < $F | grep -vF '[文字列]' | wc -l) $F"; done | sed -e "s@.gz@@g" | awk '{print substr($2, 0, 21),$1}' | sort | awk '{arr[$1]+=$2} END {for (i in arr) {print i,arr[i]}}' | less
$ zgrep -F '[文字列]' access_log.201712* |wc -l

## varnishのログが 1M 以上のデータを確認
$ ionice -c2 -n7 nice -n19 awk '{ if($10 > 1000000) {print $0}}' /home/logs/varnish_log.`date +%Y%m%d`

## Apacheの処理時間(最終行)の平均値をとる
$ grep -F '[検索文字列]' logs/access_log.20180405 | awk -F ' ' '{sum+=$NF} END {print sum/NR}'

## zipファイルの中身のファイルを [文字列] でgrepする
$ for F in `ls /tmp/*`; do echo "$(unzip -c $F | grep -cF '[文字列]') $F" ; done

## gitで管理しているファイルから、検索文字列を一括置換する。
$ git grep -l '検索文字列' | xargs sed -i '' -e 's/検索文字列/置換文字列/g'

## 更新日時が90日以前のファイルを特定ディレクトリ(to_dir/)に移動させる
$ find . -mtime +90 -type f | xargs -r mv --target-directory=to_dir

## ファイルが空もしくは0行の場合、メール送信 || は && の逆。失敗したら、実行
$ test -s /tmp/test_`date +\%Y\%m\%d`.csv || echo "no file" | mail -s "hogehoge" aaa@kkk.com

## 4列目が0かつ 5列目の重複排除した、tab_text*の行数
for f in `ls tab_text*`; do echo $(cut -f 4,5 $f | egrep ^0$'\t' | cut -f 2 | nice -n19 uniq | wc -l) $f; done

greymd.hatenablog.com