新聞中心
簡介
網(wǎng)上有很多輔助開發(fā)的小工具,如base64,md5之類的,但這些小工具其實基本都可以用Linux命令實現(xiàn),即方便又高效。

查看特殊字符
把這個放在首位,是因為這個實在太重要了,程序經(jīng)常會因為特殊的看不見的字符而出現(xiàn)bug,因此一些本應(yīng)該執(zhí)行正確而實際出乎意料的字符串處理,你都應(yīng)該看看是否含有特殊字符。
$ echo 'hello'|sed -n 'l'
hello$
$ echo 'hello'|cat -A
hello$
$ echo 'hello'|od -c
0000000 h e l l o \n
0000006
執(zhí)行上面的命令會發(fā)現(xiàn),echo會給輸出加一個換行符。
查看字節(jié)數(shù)
當(dāng)出現(xiàn)數(shù)據(jù)庫字段超長錯誤時,這個命令會很有用,如oracle的varchar2(64)類型,表示最多存64字節(jié),而業(yè)務(wù)插入的字符串是中英混合的,估計它有多少字節(jié)還挺麻煩。
$ echo -n 'hello,張三'|iconv -t utf-8|wc -c
12
時間戳轉(zhuǎn)換
#日期串轉(zhuǎn)時間戳
$ date -d '2020-06-08 00:13:28' +%s
1591546408
#時間戳轉(zhuǎn)日期串
$ date -d '@1591546408' +"%F %T %z"
2020-06-08 00:13:28 +0800
#帶時區(qū)版本,時區(qū)很重要,要時時刻刻注意
TZ='GMT-8' date -d '2020-06-08 00:13:28' +%s
TZ='GMT-8' date -d '@1591546408' +"%F %T %z"
csv變json
#使用csvkit中的csvjson
csvjson -y0 -I data.csv
#使用python
python -c "import csv,json;print(json.dumps(list(csv.reader(open('data.csv')))))"
文件服務(wù)器
python3 -m http.server 8000
urlencode,base64,md5,sha256
做開發(fā)經(jīng)常會用到這些。
# urlencode,建議添加為別名
$ alias urlencode='python3 -c "import sys;from urllib import request as rq;print(rq.quote(sys.argv[1],safe=\"\"))"'
$ urlencode 你好
%E4%BD%A0%E5%A5%BD
# urldecode,建議添加為別名
$ alias urldecode='python3 -c "import sys;from urllib import request as rq;print(rq.unquote(sys.argv[1]))"'
$ urldecode '%E4%BD%A0%E5%A5%BD'
你好
# base64編解碼
$ echo hello |base64 -w0
aGVsbG8K
$ echo aGVsbG8K|base64 -d
hello
# md5摘要
$ echo hello |md5sum
b1946ac92492d2347c6235b4d2611184 -
# sha256摘要
$ echo hello | sha256sum
5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03 -
# hmacWithSha256摘要
$ echo hello | hmac256 'secret'
171b5670f7b4037fb90bef773b022130e48100fdd40ea023730097da9a68f4ff
json格式化
$ echo '{"id":1,"name":"lisi"}' | jq .
{
"id": 1,
"name": "lisi"
}
字符串escape與unescape
#將"轉(zhuǎn)成\"
$ echo 'hi,"lisi"' | jq -R 'tojson' -r
"hi,\"lisi\""
#將\"轉(zhuǎn)成"
$ echo '"hi,\"lisi\""' | jq -R 'fromjson' -r
hi,"lisi"
#json屬性值里是json內(nèi)容,不知你有沒有遇到過這種蹩腳設(shè)計
$ echo '{"code":200,"data":"{\"id\":1,\"name\":\"lisi\"}"}' | jq '.data=(.data|fromjson)'
{
"code": 200,
"data": {
"id": 1,
"name": "lisi"
}
}
unicode編碼
開發(fā)時,也經(jīng)常需要在漢字與\u4f60形式之間轉(zhuǎn)換,下面這些命令就很有用了。
#unicode解碼
$ echo -e '\u4f60\u597d'
你好
$ echo $'\u4f60\u597d'
你好
$ echo '\u4f60\u597d'|sed 's/\\u//g'|xxd -r -ps|iconv -f ucs-2be
你好
#unicode編碼
$ echo -n '你好'|iconv -t ucs-2be|xxd -ps|sed -E 's/.{4}/\\u&/g'
\u4f60\u597d
#轉(zhuǎn)換文件編碼為utf8,也很有用
enconv -L zh_CN -c -x UTF-8 file.txt
生成隨機(jī)密碼
#生成隨機(jī)密碼
$ openssl rand -hex 16
fb9f47a7ebad6bd77be332d6b3a0bc0b
$ cat /dev/urandom |head -c 16|xxd -ps
eb297181cad546210a00118d543b78bf
$ cat /dev/urandom |tr -dc A-Za-z0-9 |head -c 32
V1NB2Oc1mCJ3mNfofDZCQB68dRde30Xz
#生成10以內(nèi)隨機(jī)數(shù)
awk -v b=$(cat /dev/urandom|tr -dc 0-9|head -c 9) 'BEGIN{srand(b);print int(rand()*10)}'
cat /dev/urandom|head -c 4|od -An -t u4 --endian=big|awk '{print int($1/2^32*10)}'
#生成uuid
$ uuidgen
7b45c1c2-0533-45e5-9903-802ee58b6638
ip地址轉(zhuǎn)數(shù)字
眾所周知,ip地址實際是一個4字節(jié)的數(shù)字,如果把ip以數(shù)字的形式保存在數(shù)據(jù)庫中,可以節(jié)省空間。
#ip轉(zhuǎn)數(shù)字
$ echo 192.168.0.1|tr . '\n'|xargs printf "%02X"|xxd -r -ps|od -An -t u4 --endian=big
3232235521
#數(shù)字轉(zhuǎn)ip
$ printf "%08X" 3232235521|xxd -r -ps |od -An -t u1
192 168 0 1
進(jìn)制轉(zhuǎn)換
#printf可以實現(xiàn)十進(jìn)制到十六進(jìn)制的轉(zhuǎn)換
$ printf "%08X" 3232235521
C0A80001
#bc可以實現(xiàn)任意進(jìn)制之間互轉(zhuǎn)
$ echo C0A80001|sed 's/^/obase=10;ibase=16;/g'|bc
3232235521
$ echo C0A80001|sed 's/^/obase=2;ibase=16;/g'|bc
11000000101010000000000000000001
查看ascii
#直接查看man文檔
man ascii
#用od查看
printf "%0.2X" {0..127}| xxd -r -ps | od -t x1d1ca
搜索內(nèi)容
在搜索日志時,tac通常比cat更有用,比如我們搜索最近產(chǎn)生的10次異常。
tac app.log|grep -iw -B 20 -m 10 'exception'|tac
另外,當(dāng)不知道要找的內(nèi)容在當(dāng)前目錄下的那個文件中時,應(yīng)該優(yōu)先使用grep -rn搜索一把,比如忘記了tomcat的端口在哪配置。
grep -rn -w 8080 .
查看進(jìn)程日志
當(dāng)你進(jìn)入一個陌生的服務(wù)器環(huán)境,不知道java進(jìn)程產(chǎn)生的日志文件在哪,與其問別人,不如直接自己找。
#使用lsof
pid=`pidof java`
lsof -p $pid|grep .log$
#lsof不可用時,試試這個
ls -l /proc/$pid/fd |grep .log$
反向shell
有時,需要別人幫忙排查問題,但又不想把服務(wù)器密碼告訴別人,這時可以給別人一個反向shell。
#獲取shell端
socat file:`tty`,rawer TCP-LISTEN:9999,bind=0.0.0.0,reuseaddr,keepalive,keepcnt=3,keepidle=600,keepintvl=600,pf=ip4
#給出shell端
nohup socat system:'stty rows 63 columns 207;bash -li',pty,stderr,setsid,sigint,sane,ctty TCP:192.168.0.1:9999 &
統(tǒng)計行數(shù)
# 統(tǒng)計行數(shù)
wc -l
sed -n '$='
# 分組統(tǒng)計行數(shù)
uniq -c
生成連續(xù)時間片
生成連續(xù)時間片,一般用在腳本中,比如查詢一年的數(shù)據(jù)量,當(dāng)數(shù)據(jù)量很大時,直接查詢是出不來結(jié)果的,這時可以把1年拆成1天天的,讓查詢1天天的跑。
如下,1年拆成1天天時間范圍的sql,丟到mysql命令里慢慢查。
generate_day_range(){
seq $(date -d '2022-01-01' +%s) $((24*3600)) $(date -d '2022-02-01' +%s) | sed '1!{$!p}' | paste - -
}
query_one_day(){
begin_time=$(date -d "@$1" +'%F %T')
end_time=$(date -d "@$2" +'%F %T')
sql="select count(*) from order where create_time >= '${begin_time}' and create_time < '${end_time}'; ";
echo "$sql"
mysql -N -e "$sql"
}
export -f query_one_day
generate_day_range | xargs -l -P2 bash -c 'query_one_day "$@"' -
pv顯示進(jìn)度與速度控制
長時間運行的腳本,看不到進(jìn)度讓人很著急,于是就有了pv命令。
如cp命令,本身沒有顯示進(jìn)度功能,復(fù)制大文件干瞪眼,這時可以使用pv命令代替。
pv file1 > file2
如上節(jié)查詢1年數(shù)據(jù)量的腳本,要查看執(zhí)行進(jìn)度,只需要在mysql命令前放入pv命令即可。
generate_day_query_sql(){
fmt='select count(*) from order where create_time >= "%s" and create_time < "%s"; \n';
seq 0 $1 \
|xargs -i date -d "2021-01-01 00:00:00 {} days" +'%F %T' \
|sed '1!{$!p}' \
|paste - - \
|awk -F'\t' -v fmt="$fmt" '{printf fmt,$1,$2}'
}
# -l表示計算流過pv的行數(shù),pv默認(rèn)計算流過的字節(jié)
# -s指定總行數(shù),這樣每一行文本流過pv,pv就能計算出當(dāng)前進(jìn)度了
generate_day_query_sql 365 | pv -l -s 365 | mysql -vvv
pv還能用來控制速度,這樣就能避免腳本把數(shù)據(jù)庫查掛了。
# -L 2表示文本流過速度不超過每秒2行
generate_day_query_sql 365 | pv -l -s 365 -L 2 | mysql -vvv
對比表結(jié)構(gòu)
相同系統(tǒng),不同環(huán)境的數(shù)據(jù)庫,保持一致表結(jié)構(gòu)其實是比較困難的,當(dāng)需要找出他們的不同點時,盡量不要一個個字段去對比,效率太低了。
#導(dǎo)出db1中所有表名
echo 'show tables' | mysql --skip-column-names -D db1 > table_names.txt
#導(dǎo)出db1與db2的表結(jié)構(gòu)
cat table_names.txt | sed 's/.*/show create table &;/' | tee >(mysql -D db1 > db1_tables.txt) >(mysql -D db2 > db2_tables.txt)
#恢復(fù)換行符
sed -i 's/\\n/\n/g' db1_tables.txt db2_tables.txt
#對比表結(jié)構(gòu)
icdiff db1_tables.txt db2_tables.txt
總結(jié)
可以將這些工具命令添加為Linux別名,用熟練后,你會發(fā)現(xiàn)你根本離不開它。創(chuàng)新互聯(lián)分享。
網(wǎng)站題目:20個常用的Linux工具命令
文章源于:http://www.dlmjj.cn/article/djgcdsp.html


咨詢
建站咨詢
