工利其器:shell使用记录(2)

0. 环境要求

  • shell环境:mac 或 linux 或 cygwin

1. 命令行下转换数字的进制

相关命令:

bc - An arbitrary precision calculator language

1
2
$ echo "obase=2; ibase=16; C2" |bc
$ echo "obase=2; ibase=16; F0F0" |bc
  • obase 输出数值的进制
  • ibase 输入数值的进制

2.json转换加工

相关命令,需要安装:

jq - Command-line JSON processor

输入的json数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
{
"code": 0,
"message": "success",
"data": {
"success": [],
"fail": [],
"skip": [
{
"orderId": "2020020717354289900888",
"orderStatus": 1,
"merchantId": "111222",
"orderType": "9910008",
"managerId": 360119,
"cityId": 337,
"districtId": 2357,
"storeId": "x",
"creator": 360119,
"customerId": "158099739961230006",
"createdAt": "2020-02-07 17:35:43",
"updatedAt": "2020-04-16 18:31:30"
},
{
"orderId": "2020020611201319900999",
"orderStatus": 2,
"merchantId": "111333",
"orderType": "9910008",
"managerId": 122319,
"cityId": 99,
"districtId": 3049,
"storeId": "x",
"creator": 122319,
"customerId": "152647240351230043",
"createdAt": "2020-02-06 11:20:13",
"updatedAt": "2020-04-16 18:31:31"
}
]
}
}

将json转为csv

1
2
3
$ jq '.data.skip | .[] | [.orderId, .orderStatus, .orderType, .storeId, .createdAt] | join(", ")' demo.json
"2020020717354289900888, 1, 9910008, x, 2020-02-07 17:35:43"
"2020020611201319900999, 2, 9910008, x, 2020-02-06 11:20:13"

说明:

  • 使用pipe方式组合处理:|
  • json path .data.skip 取到数组
  • json path .[] 遍历数组
  • json path [.orderId, .orderStatus, .orderType, .storeId, .createdAt] 取数组元素中的相关字段
  • join(", ")是jq的内置函数,将上一个filter输出的结果join成一个字符串

3. maven采集项目依赖信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 将dependency tree以 dot 格式输出到每个项目下的 target/deps_tree.dot 文件
$ mvn compile dependency:tree -DoutputType=dot -Doutput=target/deps_tree.dot

#
$ ll **/target/*.dot
-rw-r--r-- 1 zhangjy staff 878B Jan 6 20:26 target/deps_tree.dot
-rw-r--r-- 1 zhangjy staff 1.2K Jan 6 20:26 xfund-api/target/deps_tree.dot
-rw-r--r-- 1 zhangjy staff 38K Jan 6 20:26 xfund-main/target/deps_tree.dot

$ tar cvf med_deps.tar **/target/deps_tree.dot
a target/deps_tree.dot
a xfund-api/target/deps_tree.dot
a xfund-main/target/deps_tree.dot

$ curl -F "deps=@med_deps.tar" -F "pid=sale_java/sale-boot" http://127.0.0.1:8080/collect/java

DOT(Graphviz DOT format)文件解析

我们的golang项目用的这个库:

https://github.com/awalterschulze/gographviz
Parses the Graphviz DOT language in golang

4. 按文件存储顺序拷贝文件 2021/01/10

我妈有一个简易录音机用来录佛经,文件存在sd卡上,她想拷贝多份。在mac上直接拷贝到新sd卡后,插入简易录音机播放时,发现播放顺序和原sd卡的播放顺序不一致。

简易录音机功能非常简陋,怀疑是加载文件列表时,直接按文件系统的存储顺序加载。mac下使用命令 ls -f -l 对比了新旧sd卡下文件列表的存储顺序,确认了问题。旧sd卡的第一个文件并不是文件名排序下的第一个文件。同时,新sd卡的第一个文件,也不是按文件名排序的第一个文件,mac拷贝时也未按文件名顺序写入,推测应该是多文件并行拷贝导致写入顺序随机。

想到的解决方法是:

  • 先按旧sd卡下文件的存储顺序,给文件名加自增排序前缀,按文件名固定文件顺序。
  • 拷贝到新sd卡的时候,按新文件名顺序依次拷贝,确保写入顺序。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# mac 下默认按文件名排序('-1'是数字1)
$ ls -1

# 按文件在文件系统中的存储顺序列出文件名('-1'是数字1)
$ ls -f -1 RECORD0/
$ ls -f -1 RECORD0/ | grep ".mp3" > orders.txt

# 根据文件在系统中的存储顺序,给文件加上自增前缀
$ cat -n order.txt| while read n f; do echo cp -v "RECORD0/${f}" "RECORD0x/$(printf "%03d_%s" $n $f)"; done
cp -v RECORD0/REC083M.mp3 RECORD0x/001_REC083M.mp3
cp -v RECORD0/REC002M.mp3 RECORD0x/002_REC002M.mp3
cp -v RECORD0/REC003M.mp3 RECORD0x/003_REC003M.mp3
cp -v RECORD0/REC004M.mp3 RECORD0x/004_REC004M.mp3
...
# 确认生成的cp命令无误后,上述命令末尾pipe到sh执行,拷贝到了新目录RECORD0x

# 命令行下使用cp命令,按文件名顺序依次拷贝文件,保证按期望顺序写入
/Volumes $ mkdir SDCARD/RECORD0
/Volumes $ cp -v ~/Downloads/liuyf2020/RECORD0x/*.mp3 SDCARD/RECORD0

按上述方法处理后,把新sd卡插入录音机试听,确认问题fix。