#76 debtree: DEB 依赖关系
Linux DEB 2021-03-13输出 dot 格式的包依赖关系图,可以用 graphviz 生成图片。
coding in a complicated world
输出 dot 格式的包依赖关系图,可以用 graphviz 生成图片。
jq 是我在命令行中解析 JSON 的一个常用工具,用起来非常顺手。
curl https://24pullrequests.com/users.json | jq
# 取第一个元素
curl https://24pullrequests.com/users.json | jq '.[0]'
# 取第一个元素的指定字段
curl https://24pullrequests.com/users.json | jq '.[0].nickname'
# 切片
curl https://24pullrequests.com/users.json | jq '.[:2]'
# 遍历
curl https://24pullrequests.com/users.json | jq '.[] | .nickname'
# 取字段
curl https://24pullrequests.com/users/changeworld.json | jq .nickname
# 取多个字段
curl https://24pullrequests.com/users/changeworld.json | jq '.nickname,.contributions_count'
# 获取列表长度
curl https://24pullrequests.com/users.json | jq length
# 列出 Keys
curl https://24pullrequests.com/users/changeworld.json | jq keys
curl https://24pullrequests.com/users/changeworld.json | jq "keys[]"
curl https://24pullrequests.com/users.json | jq ".[0] | keys[]"
# 列出 Keys 和 值类型
cat a.json | jq ".[0] | keys,map(type)"
cat a.json | jq ".[0] | to_entries | map([.key, (.value | type)])"
cat a.json | jq '.[0] | to_entries | map("\(.key) : \(.value|type)")[]'
还有很多更强大的用法,可以参考文档,我就会上面几个,在命令行中简单搜索 JSON 也够用了。
刚在文档中学会一招,重新组合 JSON:
curl https://24pullrequests.com/users/changeworld.json | jq '[.nickname, .organisations[].login]'
curl https://24pullrequests.com/users/changeworld.json | jq '{name:.nickname, orgs:[.organisations[].login]}'
👍🏻 Nice!!!
刚才在 linux.cn 上看到这篇文章:CentOS 8 落幕,“免费” 的 RHEL 没了。
大意就是说 CentOS 项目组集中全力开发 CentOS Stream 作为 RHEL 上游。作为 RHEL 再发布版本的 CentOS 不会继续发布了。
邮件列表原文链接:https://lists.centos.org/pipermail/centos-announce/2020-December/048208.html
即便上了 ELK,也不可能所有日志往里面塞,搜日志是程序员的日常工作之一。
以 grep log by time efficiently
为关键词搜到 SO 上的这个问题: What is the most efficient way to extract logs between two time stamps?
要求:
提问的人自己提出来的方案:
grep -a -A 1000000 "03/09" fileName.txt | grep -a -B 1000000 "03/10"
他认为不好,因为有点慢,而且有时会漏掉一些日志。
漏掉日志可能和他的日志格式有关,这倒应该问题不大,主要是这个方案看起来就确实效率不行。
PS:如果不用模式匹配,可以加上 -F
,应该可以提高效率。
# 2020/07/22 10:00:00,100 INFO [main] com.example.LoggingApplication - Starting Application
awk '$2>="16:30:00"{s=1} s; $2>="17:00:00"{exit}' event.log
这个看起来很牛逼,主要是有一个 exit
。
这篇文章不是要记录那些乱七八糟的转义规则,而是讲怎么借助工具避开它。
GitHub 上偶然看到一个仓库 chrissimpkins/shellescape,做了些实验之后,发现非常好用。
别看就几行代码,真的感觉世界都清静了。
PS:代码我没细看,人生短暂,我不想去记这些没用的知识点。
import re
_find_unsafe = re.compile(r'[^\w@%+=:,./-]').search
def quote(s):
if not s:
return "''"
if _find_unsafe(s) is None:
return s
return "'" + s.replace("'", "'\"'\"'") + "'"
示例:
commands = """
grep -F '"userId": "1"' /tmp/test.log
grep 'aaa.bbb.$100.*' /tmp/test.log
""".strip().splitlines()
for command in commands:
print(quote(command))
touch nihao.txt
code !$
take xxx # oh-my-zsh
mkdir xxx && cd $_
for i in {0..100}; do touch aaa_bbb_$i.jpg; done
rename 's/_bbb//' aaa_*.jpg
# for zsh
autoload zmv
zmv -n '(*)_(*).jpg' '$2_$1.jpg'
-> % ps -ef | grep rsyslogd | grep -Fv grep
syslog 1068 1 0 1月06 ? 00:00:03 /usr/sbin/rsyslogd -n -iNONE
-> % sudo ls -l /proc/1068/fd
总计 0
lr-x------ 1 root root 64 1月 8 16:54 0 -> /dev/null
l-wx------ 1 root root 64 1月 8 16:54 1 -> /dev/null
l-wx------ 1 root root 64 1月 8 16:54 10 -> /var/log/kern.log
l-wx------ 1 root root 64 1月 8 16:54 11 -> /var/log/auth.log
l-wx------ 1 root root 64 1月 8 16:54 2 -> /dev/null
lrwx------ 1 root root 64 1月 6 09:46 3 -> 'socket:[13299]'
lr-x------ 1 root root 64 1月 8 16:54 4 -> /dev/urandom
lrwx------ 1 root root 64 1月 8 16:54 5 -> 'socket:[27825]'
lrwx------ 1 root root 64 1月 8 16:54 6 -> 'socket:[27831]'
lr-x------ 1 root root 64 1月 8 16:54 7 -> /proc/kmsg
lrwx------ 1 root root 64 1月 8 16:54 8 -> 'socket:[22468]'
l-wx------ 1 root root 64 1月 8 16:54 9 -> /var/log/syslog
-> % sudo find /proc/*/fd -ls | grep /var/log/syslog
2551982 0 l-wx------ 1 root root 64 1月 8 16:50 /proc/1068/fd/9 -> /var/log/syslog
-> % ps -fq 1068
UID PID PPID C STIME TTY TIME CMD
syslog 1068 1 0 1月06 ? 00:00:03 /usr/sbin/rsyslogd -n -iNONE
Win / Win + S 窗口概览
Win + A 程序搜索,或者 Win 双击
Win + D 显示桌面
Win + L 锁定窗口
Win + V / Win + M 打开日历和事件
Win + 数字 打开左侧菜单上的程序
Win + Left 将窗口移动到左侧
Win + Right 将窗口移动到右侧
Win + Up 最大化
Win + Down 还原
Win + Home 切换到第一个 Workspace
Win + PageUp 切换到上一个 Workspace
Win + PageDown 切换到上一个 Workspace
Alt + F2 运行一个命令
Alt + F4 关闭当前窗口
Alt + F6
Alt + F10 窗口最大化 / 还原
Ctrl + Alt + T 打开终端
Win + Space 切换输入法
Alt + Space 窗口菜单
Win + C 计算器 自定义
Win + F 文件浏览器 自定义
Alt + Tab 切换窗口
Win + Tab 切换程序
Alt + ~ / Win + ~ 同一个程序的不通窗口切换
屏幕截图并保存:PrntScr
加 Shift 选区截屏,加 Alt 窗口截屏,加 Ctrl 截屏到剪切板
PS:Ubuntu 22.04 之后,截图的逻辑调整了。
交互式截屏:PrntScr
加 Shift 屏幕截图并保存,同时复制到剪切板
加 Alt 窗口截屏并保存,同时复制到剪切板
加 Ctrl 没有任何效果
Ctrl + Shift + N new window
Ctrl + Shift + Q quit window
Ctrl + Shift + T 打开新标签
Ctrl + Shift + W close tab
Ctrl + Shift + PageUp Tab 左移
Ctrl + Shift + PageDown Tab 右移
Ctrl + Shift + C 复制
Ctrl + Shift + V 粘贴
Ctrl + / 清空
F9 打开 CopyQ 自定义
我们一般使用 du 命令,不正是做这个用的么(Disk Usage)?
du -hsc # 当前目录占用空间大小
du -hsc *.log* # 查看文件大小
du -hsc a b c d # 查看指定几个目录的大小