どの環境でも使えるかは不明。覚える気がないので自分用のメモとして残す。
主にワンライナーで利用するので移植性などは気にしてない。
できなければ別の方法を使うだけ。
随時追加。
正規表現を可視化するサービス
https://regexper.com/
https://regexr.com/
sed
# ()で囲った部分は\1とかで抜き出して使える
$ echo 0123456789 |sed "s/^\(....\)\(...\)\(...\)/\1-\2-\3/g"
0123-456-789
$ echo 0123456789 |sed "s/^\([0-9]\{4\}\)\([0-9]\{3\}\)\([0-9]\{3\}\)/\1-\2-\3/g"
0123-456-789
sed 1文字ずつ変換
# aをA,bをB,dをsに変換する。
$ echo {a..d} |sed "y/abd/ABs/"
A B c s
sedで\nを改行する
$ LF=$(printf '\\\012_')
$ LF=${LF%_}
$ echo "hogehoge\nfoo\nbar" | sed 's/\\n/'"$LF"'/g'
sedで改行を挟んで置換する、更に置換後にも改行を入れる
$ LF=$(printf '\\\012_')
$ LF=${LF%_}
$ echo "aa AA,bb BB,cc CC" |tr "," "\n"
aa AA
bb BB
cc CC
$ echo "aa AA,bb BB,cc CC" |tr "," "\n" |sed '/A/N;s/AA\nbb/AA'"${LF}"'XX/'
aa AA
XX BB
cc CC
マッチした行から次のマッチした行までを抜き出す
seq 9 |sed -n -e '/3/,/8/p'
3
4
5
6
7
8
特定行を削除
$ seq 3 |sed '1d'
2
3
grep
1文字ごとに改行
$ echo abcd |grep -o "."
a
b
c
d
行番号つける
$ grep -n "." a
1:a
2:b
3:c
4:d
5:e
6:f
echo
エスケープ文字解釈
$ echo -e "a\nb"
a
b
進数
$ echo $((10+10)) # 10進数の10たす10進数の10
20
$ echo $((10+010)) # 10進数の10たす8進数の10
18
$ echo $((10+0x10)) # 10進数の10たす16進数の10
26
cat
制御コードを表示
$ cat -e file
a$
b$
c$
d$
e$
f$
uniq
集計 sort|uniq -c
$ seq 3 |sed p |sort |uniq -c`
#重複数 文字列
2 1
2 2
2 3
xargs
$ seq 9 |xargs -n 3
1 2 3
4 5 6
7 8 9
awk
大文字/小文字に変換
$ echo "ABCdefg" |awk '{a=toupper($0);print a}'
ABCDEFG
$1が同じ行の$2をまとめる
$ echo "a 1,b 4,a 2,a 3,b 5"|tr "," "\n"
a 1
b 4
a 2
a 3
b 5
$ echo "a 1,b 4,a 2,a 3,b 5"|tr "," "\n" |awk '{D[$1]=D[$1]" "$2}END{for(i in D){print i D[i]}}'`
a 1 2 3
b 4 5
列数カウント
$ echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
$ echo {a..z}|awk 'z=split($0,word," "){print z}'
26
文字列を含むか検索
$ echo -e "ABC\ndefg\nAB" |awk '{a=match($0,/AB/);print a}'
1
0
1
検索に一致した次の行を取り出す
$ echo ab1cdef1g |grep -o "." |awk '/1/{getline ;print $0}'
c
g
数学的な計算
#exp
#int
#log
#sin
#sqrt
#atan2
#rand
#srand
$ echo "2" |awk '{print cos($1)}'
-0.416147
置換
# gsubはグローバル <-> sub
$ echo "abc" |awk '{a=gsub(/a/,"A",$0);print $0}'
Abc
indexを返す
$ echo "abcdefg" |awk '{a=index($0,"d");print a}'
4
BEGINと変数
$ echo a b c d|awk 'BEGIN{one=1;two=2}{print $(one + two)}'
c
FS,RS,NR,NF
# FS=システム変数,フィールドセパレータ
$ echo -e "aawfa\te,awf" |awk 'BEGIN{FS = "[,\t]"}{print $2}'
e
# RS=レコードセパレータ
echo {1..10} |awk '{print $0RS"b"}'
1 2 3 4 5 6 7 8 9 10
b
# NR
$ echo {1..10}|sed "s/ /\n/g" |awk '{print NR":",$0"$"}'
1: 1$
2: 2$
3: 3$
4: 4$
5: 5$
6: 6$
7: 7$
8: 8$
9: 9$
10: 10$
# NF 列数が2のものだけ抜き出す
echo "0,1 1,2 2,3,4,5 5"|tr "," "\n" |awk 'NF==2{print $0}'
1 1
2 2
5 5
位置揃え
# printf
# c.ascii文字
# d.10進数
# i.10進整数POSIX
# e.浮動小数点 小文字
# E.同上 大文字
# f.上
# g.e or f と同じで末尾0非表示
# G.E or f ...
# o.無符号8進数
# s.文字列
# x.無符号16進数 小文字
# X.同上 大文字
# %.リテラルの%
$ echo {a..c}{0..3} |tr ' ' '\n' |awk '$1 ~ /c/ || $1 ~ /0/{printf "|%10s|\n", $1}'
| a0|
| b0|
| c0|
| c1|
| c2|
| c3|
$ $ echo {a..c}{0..3} |sed "s/ /\n/g" |awk '$1 ~ /c/ || $1 ~ /0/{printf "|%-10s|\n", $1}'
|a0 |
|b0 |
|c0 |
|c1 |
|c2 |
|c3 |
substr指定以降の文字列を返す
$ echo "abcdefg" |awk '{a=substr($0,4);print a}'
defg
文字数カウント
$ echo "abcdefg" |awk '{a=length($0);print a}'
7
sort
引数なし
$ cat test
1:2.0:1e+10:a
2:3.0:2e+11:b
2:1.0:3e+13:d
3:2.0:1e+10:f
3:6.0:6e+18:g
2:2.0:2e+13:c
3:1.0:7e+12:h
4:9.0:9e+14:i
10:0.0:1e-12:x
10:0.0:1e-11:y
11:0.0:1e+11:z
2:4.0:4e+14:e
5:8.0:1e+20:k
$ sort test
10:0.0:1e-11:y # キャラクタとみなすので先頭の10が一番初めにくる
10:0.0:1e-12:x
11:0.0:1e+11:z
1:2.0:1e+10:a
2:1.0:3e+13:d
2:2.0:2e+13:c
2:3.0:2e+11:b
2:4.0:4e+14:e
3:1.0:7e+12:h
3:2.0:1e+10:f
3:6.0:6e+18:g
4:9.0:9e+14:i
5:8.0:1e+20:k
-n
数値
$ sort -n test
1:2.0:1e+10:a #数値で並ぶので1が初めにくる
2:1.0:3e+13:d
2:2.0:2e+13:c
2:3.0:2e+11:b
2:4.0:4e+14:e
3:1.0:7e+12:h
3:2.0:1e+10:f
3:6.0:6e+18:g
4:9.0:9e+14:i
5:8.0:1e+20:k
10:0.0:1e-11:y
10:0.0:1e-12:x
11:0.0:1e+11:z
-g
,-r
,-k
など色々入り
# 引数説明
-t: セパレータを:にする。
-k 2n,2: 数値(n)として2列目を昇順ソート。SQLのorder byと同じ感じで第1ソートする。
-k 3gr,3: 浮動小数点の理工学的な記法 (`1.0e-34' や `10e100' など)を含めて、
(g)3列目を降順(r)ソート。
gオプションは遅いしあまり使わないほうがいいらしい。
-k 1rn,1: 数値として1列目の降順ソート。
-b: 変なスペースが入っていてソートがおかしくなるのを防ぐ。
consider only printable characters(from man)
$ sort -b -t : -k 2n,2 -k 3gr,3 -k 1rn,1 test
11:0.0:1e+11:z
10:0.0:1e-11:y
10:0.0:1e-12:x
2:1.0:3e+13:d
3:1.0:7e+12:h
2:2.0:2e+13:c
3:2.0:1e+10:f
1:2.0:1e+10:a
2:3.0:2e+11:b
2:4.0:4e+14:e
3:6.0:6e+18:g
5:8.0:1e+20:k
4:9.0:9e+14:i
使えそうかもしれないけど使ったことない
rev 文字列反転
$ echo {1..10} |rev
01 9 8 7 6 5 4 3 2 1
nl 行番号つける
$ nl file
1 0123456789
vimdiffぽいdiff出力
$ cat a.txt b.txt
10.00~10.90 4229 0.08 04229 0.08
10.90~11.80 4256 0.09 08485 0.17
11.80~12.70 4108 0.08 12593 0.25
12.70~13.60 4244 0.08 16837 0.34
13.60~14.50 4235 0.08 21072 0.42
14.50~15.40 4141 0.08 25213 0.50
15.40~16.30 4172 0.08 29385 0.59
10.00~10.90 4229 0.08 04229 0.08
10.90~11.80 4256 0.09 08485 0.17
11.80~12.70 4108 0.08 12593 0.25
12.70~13.60 4244 0.08 16837 0.34
13.60~14.50 4235 0.08 21072 0.42
14.50~15.40 4141 0.08 25213 0.50
15.40~16.30 4172 0.08 29384 0.59
$ diff -ybd --width=120 --suppress-common-lines {a,b}.txt
15.40~16.30 4172 0.08 29385 0.59 | 15.40~16.30 4172 0.08 29384 0.59
$ diff --side-by-side a.txt b.txt
10.00~10.90 4229 0.08 04229 0.08 10.00~10.90 4229 0.08 04229 0.08
10.90~11.80 4256 0.09 08485 0.17 10.90~11.80 4256 0.09 08485 0.17
11.80~12.70 4108 0.08 12593 0.25 11.80~12.70 4108 0.08 12593 0.25
12.70~13.60 4244 0.08 16837 0.34 12.70~13.60 4244 0.08 16837 0.34
13.60~14.50 4235 0.08 21072 0.42 13.60~14.50 4235 0.08 21072 0.42
14.50~15.40 4141 0.08 25213 0.50 14.50~15.40 4141 0.08 25213 0.50
15.40~16.30 4172 0.08 29385 0.59 | 15.40~16.30 4172 0.08 29384 0.59
n番目以降の引数を取得
N番目以降、M個の引数を取得したいときは、${@:N:M}
yes
続行するために”y”を入力し、
Enterキーを押す必要があるようなプログラムをインストールするときにyesを使える。
$ yes |sudo yum install pv
pipe viewer
$ sleep 100 |pv
0 B 0:00:01 [ 0 B/s] [<=>
pwdx
プロセスで操作中のディレクトリを取得できる
addr2line
xxx
gstack
プロセスのスタックトレースをみる。
$ gstack pid
csplit
正規表現によるファイル分割
$ cat test
###BB###
aaa
aa
###AA###
bb
b
b
b
$ csplit --suppress-matched test '/###.*###/' {*}
join
2つのファイルのデータを共通のフィールド単位で結合
awk 複数の記号をセパレータとして使用したい
#正規表現を使用するとできる
#以下はスペースと:と/を区切り文字として使用した場合の例
echo "2016/03/01 12:12:12" | awk -F'[ :/]' '{print $2}'
ポートに紐づくPID
lsof -i :3000 |awk '{print $2}' |grep -v PID |xargs
git
よく使わない物もある
X日前との差分
git diff HEAD 'HEAD@{6 month ago}'
空コミット
git commit --allow-empty -m “empty commit”
詳細ログ
export GIT_CURL_VERBOSE=1