日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
20個常用的Linux工具命令

簡介

網(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