原创:编码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。介绍网上有很多辅助开发的小工具,比如base64、md5等,但是这些小工具基本上都可以用linux命令实现,方便高效。CheckSpecialCharacters把这个放在首位是因为它太重要了,程序经常会因为特殊的不可见字符而出现bug,所以一些本应正确执行但实际上却出乎意料的字符串处理,你应该检查特殊字符。$echo'hello'|sed-n'l'hello$$echo'hello'|cat-Ahello$$echo'hello'|od-c0000000hello\n0000006执行上面的命令会发现echo会在输出符号。检查字节数。当数据库字段过长出错时,此命令将很有用。比如oracle的varchar2(64)类型,意思是最多可以存储64个字节,而业务插入的字符串是中英文混合的。估计有多少字节比较麻烦。$echo-n'你好,张三'|iconv-tutf-8|wc-c12时间戳转换#日期字符串到时间戳$date-d'2020-06-0800:13:28'+%s1591546408#时间戳todatestring$date-d'@1591546408'+"%F%T%z"2020-06-0800:13:28+0800#带时区的版本,时区很重要,注意TZ=at所有时间'GMT-8'date-d'2020-06-0800:13:28'+%sTZ='GMT-8'date-d'@1591546408'+"%F%T%z"csv到json#usecsvjsonincsvkitcsvjson-y0-Idata.csv#usepythonpython-c"importcsv,json;print(json.dumps(list(csv.reader(open('data.csv')))))"文件serverpython3-mhttp.server8000urlencode,base64,md5,sha256这些在开发中经常用到。#urlencode,建议添加为别名$aliasurlencode='python3-c"importsys;fromurllibimportrequestasrq;print(rq.quote(sys.argv[1],safe=\"\"))"'$urlencode你好%E4%BD%A0%E5%A5%BD#urldecode,建议添加为别名$aliasurldecode='python3-c"importsys;fromurllibimportrequestasrq;print(rq.unquote(sys.argv[1]))"'$urldecode'%E4%BD%A0%E5%A5%BD'hello#base64codec$echohello|base64-w0aGVsbG8K$回声aGVsbG8K|base64-dhello#md5摘要$echohello|md5sumb1946ac92492d2347c6235b4d2611184-#sha256摘要$echohello|sha256sum5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03-#hmacWithSha256摘要$echohello|hmac256'secret'171b5670f7b4037fb90bef773b022130e48100fdd40ea023730097da9a68f4ffjson格式化$echo'{"id":1,"name":"lisi"}'|jq.{"id":1,"name":"lisi"}stringescape和unescape#convert"into\"$echo'hi,"lisi"'|jq-R'tojson'-r"hi,\"lisi\""#Will\"切换到"$echo'"hi,\"lisi\""'|jq-R'fromjson'-rhi,"lisi"#json属性值为json内容,不知道大家有没有遇到过这种跛脚Design$echo'{"code":200,"data":"{\"id\":1,\"name\":\"lisi\"}"}'|jq'.data=(.data|fromjson)'{"code":200,"data":{"id":1,"name":"lisi"}}在开发unicode编码时,经常需要在汉字和\u4f60形式之间进行转换,如以下命令非常有用#unicode解码$echo-e'\u4f60\u597d'hello$echo$'\u4f60\u597d'hello$echo'\u4f60\u597d'|sed's/\\u//g'|xxd-r-ps|iconv-fucs-2behello#unicode编码$echo-n'hello'|iconv-tucs-2be|xxd-ps|sed-E's/.{4}/\\u&/g'\u4f60\u597d#转换文件编码为utf8,这个也有用enconv-Lzh_CN-c-xUTF-8file.txt生成随机密码#generaterandompassword$opensslrand-hex16fb9f47a7ebad6bd77be332d6b3a0bc0b$cat/dev/urandom|head-c16|xxd-pseb297181cad546210a00118d543b78bf$cat/dev/urandom|tr-dcA-Za-z0-9|head-c32V1NB2Oc1mCJ3mNfofDZCQB68dRde30Xz#生成10以内的随机数awk-vb=$(cat/dev-durandom|-0-9|headc9)'BEGIN{srand(b);printint(rand()*10)}'cat/dev/urandom|head-c4|od-An-tu4--endian=big|awk'{printint($1/2^32*10)}'#Generateuuid$uuidgen7b45c1c2-0533-45e5-9903-802ee58b6638将ip地址转为数字众所周知,ip地址其实是一个4字节的数字。数字形式保存在数据库中,可以节省空间。#ip到数字$echo192.168.0.1|tr。'\n'|xargsprintf"%02X"|xxd-r-ps|od-An-tu4--endian=big3232235521#digitaltoip$printf"%08X"3232235521|xxd-r-ps|od-an-tu119216801base转换#printf可以实现十进制到十六进制的转换$printf"%08X"3232235521C0A80001#bc可以实现任意base$echoC0A80001|sed's/^/obase=10;ibase=16;/g'|bc3232235521$echoC0A80001|sed's/^/obase=2;ibase=16;/g'|bc11000000101010000000000000000001查看ascii#直接查看man文档manascii#Viewwithodprintf"%0.2X"{0..127}|我们搜索最后10个异常。tacapp.log|grep-iw-B20-m10'exception'|tac另外,当你不知道你要找的内容在当前目录下的文件中时,你应该使用grep-rn来搜索第一,比如忘记tomcat端口配置在哪里。grep-rn-w8080。查看进程日志当你进入一个陌生的服务器环境,不知道java进程产生的日志文件在哪里时,与其问别人不如自己找。#Uselsofpid=`pidofjava`lsof-p$pid|grep.log$#当lsof不可用时,试试这个ls-l/proc/$pid/fd|grep.log$Reverseshell有时,你需要有人来帮你排查问题,又不想把服务器密码告诉别人,那你可以给别人一个反向shell。#获取shell端socat文件:`tty`,rawerTCP-LISTEN:9999,bind=0.0.0.0,reuseaddr,keepalive,keepcnt=3,keepidle=600,keepintvl=600,pf=ip4#给shell端nohupsocatsystem:'sttyrows63columns207;bash-li',pty,stderr,setsid,sigint,sane,cttyTCP:192.168.0.1:9999&statisticalrows#统计行wc-lsed-n'$='#uniq-c生成连续时间片生成连续时间片,一般用在脚本中,比如查询一年的数据量。当数据量很大时,直接查询是出不出结果的。这时候可以将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}'|粘贴--}query_one_day(){begin_time=$(date-d"@$1"+'%F%T')end_time=$(date-d"@$2"+'%F%T')sql="selectcount(*)fromorderwherecreate_time>='${begin_time}'andcreate_time<'${end_time}';";echo"$sql"mysql-N-e"$sql"}导出-fquery_one_daygenerate_day_range|xargs-l-P2bash-c'query_one_day"$@"'-pv显示进度和速度控制长时间运行的脚本,看不到进度让人着急,于是就有了pv命令。比如cp命令本身没有显示进度的功能,复制大文件也没用。这时候可以用pv命令代替。pvfile1>file2如上一节查询一年数据量的脚本,查看执行进度,只需要将pv命令放在mysql命令之前即可。generate_day_query_sql(){fmt='selectcount(*)fromorderwherecreate_time>="%s"andcreate_time<"%s";\n';seq0$1\|xargs-idate-d"2021-01-0100:00:00{}days"+'%F%T'\|sed'1!{$!p}'\|paste--\|awk-F'\t'-vfmt="$fmt"'{printffmt,$1,$2}'}#-l表示计算流过pv的行数,pv计算流过的字节数#-s默认指定总行数,让每行文本流过pv,pv可以计算出当前进度后,生成_day_query_sql365|pv-l-s365|mysql-vvvpv也可以用来控制速度,防止脚本检查数据库。#-L2表示文本流量不超过每秒2行generate_day_query_sql365|pv-l-s365-L2|mysql-vvv比较相同表结构的系统和不同环境下的数据库,其实保持表结构一致是比较困难的,当你需要找出它们的差异时,尽量不要一一比较字段,效率是太低。#导出db1中所??有表名echo'showtables'|mysql--skip-column-names-Ddb1>table_names.txt#导出db1和db2的表结构cattable_names.txt|sed's/.*/show创建表&;/'|tee>(mysql-Ddb1>db1_tables.txt)>(mysql-Ddb2>db2_tables.txt)#恢复换行符sed-i's/\\n/\n/g'db1_tables.txtdb2_tables.txt#contrasttablestructureicdiffdb1_tables.txtdb2_tables.txt总结您可以将这些工具命令添加为Linux别名。熟练使用它们之后,你会发现你离不开它们。上一篇内容Linux文本命令技巧(下)Linux文本命令技巧(上)原来awk真是神器,好用的并行命令,常用网络命令汇总
