我的博客

实用的 Linux 命令

目录
  1. 常用操作
    1. 管道
    2. 输出重定向到文件
    3. 后台执行命令
  2. 文件系统
    1. ls 列目录内容
    2. cd 切换目录
    3. rm 删除
    4. mv 移动
    5. cp 复制
    6. ln 创建文件链接
    7. which / whereis 查找一个命令的位置
    8. find 搜索目录树
    9. zip 压缩
    10. unzip 解压缩
    11. pwd 查看当前目录
  3. 文本处理
    1. vi / vim 文本编辑器
    2. cat
    3. grep 过滤文本
    4. more 分页显示
    5. awk 流编辑器
    6. wc 统计文本文件
    7. sort 排序
    8. uniq 去重
    9. chmod 修改权限
  4. 网络
    1. ICMP
      1. ping
      2. traceroute
    2. 网络配置
      1. ifconfig (deprecated)
      2. ip
    3. Socket
      1. netstat (deprecated)
      2. ss
  5. 系统资源查看
    1. free 查看内存使用
    2. df 查看磁盘使用
    3. ps 查看任务
    4. kill 杀进程
    5. htop (CPU/内存占用查看,进程管理)
    6. 不常用命令
  6. 其他
    1. history 查看历史命令
    2. nohup 帮助程序忽略 hang up 信号

常用操作

管道

| 符号,用于连接两个命令,把第一个命令的标准输出作为第二个命令的标准输入

输出重定向到文件

> 符号可以把命令的标准输出写入文件

&> 可合并标注错误输出,或者使用 2&>1 把标准错误输出合入标准输出

后台执行命令

& 放在命令末尾使命令在后台执行,一般需要重定向输出到文件,否则标准输出依然输出到terminal。另外如果需要在terminal结束后仍然运行,常需要配合 nohup命令,否则需要自行处理 hang up 信号。

文件系统

ls 列目录内容

-l 详细信息列表

-h 自动选择易于阅读的文件大小单位

-t 按时间排序(从新到旧)

-S 按大小排序(从大到小)

cd 切换目录

cd - 后退到上次 cd 之前的目录

cd 无参数,回到家目录

rm 删除

rm -r 递归删除(用于删除目录)

rm -f 强制删除

mv 移动

mv <source> <target>

cp 复制

cp <source> <target>

-r 递归复制,用于复制目录

ln 创建文件链接

ln <source> <target>

-s 符号连接(或者叫软连接)

which / whereis 查找一个命令的位置

which python

可显示 python 安装的位置,查到的可能是一个符号链接,可以再用 ls -l 查看链接的实际位置。

find 搜索目录树

find <path> <condition>

在 path 指定的路径内搜索。

-name 指定匹配的文件名(可使用通配符,如 *.txt 匹配所有的 txt 文件)

-empty 查找空文件或文件夹

zip 压缩

zip <要生成的压缩文件名> <文件列表>

-r 递归压缩,用于处理目录

unzip 解压缩

zip <要解压的文件名>

pwd 查看当前目录

文本处理

vi / vim 文本编辑器

退出方法是输入冒号,回到命令模式下(按 esc 键回到命令模式),输入 :q (即冒号和q)然后按回车执行。:!q 是不保存直接退出(如果修改了内容而为保存可以用该方法放弃修改直接退出)。

vi - 表示从标准输入读取内容。

vimtutor 命令可以启动 vim 教程。

cat

打印文本文件全部内容。

grep 过滤文本

grep <pattern> <file>

如果没有输入文件则从标准输入接收输入

-E 扩展的正则表达式

-i 忽略大小写

-n 输出行号

-H 输出文件名

-h 不输出文件名

-v 输出不匹配的内容

more 分页显示

空格显示下一页,回车显示下一行,q 退出

如分页显示一个文本文件 a.txtmore a.txt 或者 cat a.txt | more

如分页显示一个文本文件 a.txt中包含 hello 的行, grep hello a.txt | more

awk 流编辑器

awk 通过解析执行一种脚本语言完成对文本的处理。

-F 指定分隔符

awk 可以用于多种场景,高效的实现各种功能。

一些例子:

awk 随机抽样文件 | 我的博客 (es2q.com)

awk输出两个文件不同的行 | 我的博客 (es2q.com)

wc 统计文本文件

wc -l 统计行数

sort 排序

-n 作为数字排序 (默认作为字符串)

-r 逆序

-t 指定列分隔符,如果需要指定 tab 键(即'\t')为分隔符,需要使用 sort -t $’\t’ 或者 sort -t’\<ctrl>+v \<tab>‘ (即先输入 ctrl + v 再按 tab)

-k 选择按哪一列排序

-u 排序后去重

uniq 去重

只能去掉相邻的重复,一般需要先 sort 再 uniq

如要去掉文本文件 a.txt 中的重复内容,结果写入 b.txt,可以 sort a.txt | uniq > b.txt

chmod 修改权限

chmod <权限> <文件/目录>

权限指定方式有:

  1. 三位数字,每个数字在 0 到 7 之间,第一位表示文件主的访问权限,第二个表示同组用户,第三个表示其他用户。0到7实际上三个二进制位,最高位代表读,第二位是写,第三位是执行(对文件夹是进入)
  2. +r 增加读权限,+w 增加写权限,+x 增加执行权限。+ 换成 - 就是去掉。

网络

ICMP

ping

ping <目标主机>

可以使用 IP 地址、主机名或域名指定 目标主机

-4使用 IPv4

-6 使用 IPv6

traceroute

路由追踪

Windows 系统的对应命令是 tracert

网络配置

ifconfig (deprecated)

查看网卡配置,已经过时,较老版本的Linux系统可能自带该命令,但有的版本已经使用ip命令代替。

ip

ip addr 查看网卡配置

Socket

netstat 是常用的查看本机TCP和UDP连接信息的工具,但已经过时,较老版本的Linux系统可能自带该命令,但有的版本已经使用ss命令代替netstat。

netstat (deprecated)

-a 查看所有 sockets (默认只显示 connected)

-l 显示 Listen 的 sockets

-p 显示对应的进程

-n 显示 IP 地址而不是主机名

ss

ss -t 查看 TCP 连接

ss -u 查看 UDP 连接

-p 参数查看连接对应的进程信息

系统资源查看

free 查看内存使用

查看内存占用,常使用 free -m 或者 -g 参数按 MB 或 GB 为单位显示。其中 available 是剩余的可使用内存,used 是被占用的内存。free 是没被占用的内存。

df 查看磁盘使用

常使用 df -h 自动使用合适的单位显示。

df -i 查看 inode 使用率。

ps 查看任务

-e 显示全部进程 (默认只显示当前 终端内运行的进程)

kill 杀进程

kill <进程号>

htop (CPU/内存占用查看,进程管理)

官网 https://htop.dev/

增强的 top,用于任务管理和系统CPU,内存等资源查看。与 top 一样按 q 键退出。

按F1可查看帮助。CPU占用有四种颜色,其中红色是 kernal CPU 占用。内存有三种颜色,绿色是被占用的内存,蓝色是 buffers 占用的内存,黄色是 cache 的内存。

image.png

不常用命令

lsblk 列出系统块设备 (如硬盘,U盘,SD卡等)

lsusb 列出 USB 设备

lspci 列出 PCI 设备(如独立显卡等)

lscpu 列出 CPU 信息

其他

history 查看历史命令

nohup 帮助程序忽略 hang up 信号

用于在 terminal 关闭后保护进程不因 hang up 退出

Windows下编译安装py-leveldb

目录
  1. 编译 LevelDB
  2. 编译 Snappy
  3. 编译 py-leveldb-windows

使用环境 Windows 10,VS 2019(VS 16)

编译 LevelDB

https://github.com/google/leveldb

启动Developer Command Prompt for VS 2019

1
2
3
4
5
git clone --recurse-submodules https://github.com/google/leveldb.git
cd leveldb
mkdir build && cd build
cmake -G "Visual Studio 16" ..
msbuild /m /p:Platform=x64,Configuration=Release leveldb.sln

然后得到leveldb\build\Release\leveldb.lib

编译 Snappy

https://github.com/google/snappy

1
2
3
4
5
git clone https://github.com/google/snappy.git
git submodule update --init
mkdir build && cd build
cmake -G "Visual Studio 16" ..
msbuild /m /p:Platform=x64,Configuration=Release Snappy.sln
1
msbuild /m /p:Platform=x64,Configuration=Release leveldb_ext.sln

编译 py-leveldb-windows

https://github.com/happynear/py-leveldb-windows

1
2
3
4
5
6
7
8
set INCLUDE=C:\Users\v-xiaowensun\AppData\Local\Programs\Python\Python39\include;%INCLUDE%

set INCLUDE=D:\include;%INCLUDE%

set AdditionalIncludeDirectories=C:\Users\v-xiaowensun\AppData\Local\Programs\Python\Python39\include;%AdditionalIncludeDirectories%


set AdditionalLibraryDirectories=C:\Users\v-xiaowensun\AppData\Local\Programs\Python\Python39\libs;%AdditionalLibraryDirectories%

以上配置都无效不知为何并没有起效,最终打开工程文件把D:\Anaconda\include替换为C:\Users\v-xiaowensun\AppData\Local\Programs\Python\Python39\include

D:\Anaconda\libs替换为C:\Users\v-xiaowensun\AppData\Local\Programs\Python\Python39\libs

D:\ThirdPartyLibrary\pyleveldb\leveldbwin\lib_leveldb_vc10\lib\Release替换为C:\Users\v-xiaowensun\codes\leveldb\build\Release

再添加C:\Users\v-xiaowensun\codes\snappy\build\Release

Python 头文件路径:C:\Users\v-xiaowensun\AppData\Local\Programs\Python\Python39\include

Python 静态库路径:C:\Users\v-xiaowensun\AppData\Local\Programs\Python\Python39\libs

计算机存储

目录
graph LR;
    RAM --> SRAM
    RAM --> DRAM
    DRAM --> SDRAM
    SDRAM --> DDR[DDR SDRAM]
    ROM --> PROM
    ROM --> EPROM
    ROM --> RRPROM
    ROM --> Flash[Flash ROM]
    Flash --> NOR
    Flash --> NAND

通过freessl.cn申请免费SSL证书

目录

https://freessl.cn/提供免费的SSL证书。

要使用freessl.cn需要先注册(之前无需注册也可使用)。

可以直接使用默认配置,品牌为亚洲诚信,证书有效期为一年。输入要申请证书的域名,点击按钮创建。然后确认邮箱和创建私钥的方法。

创建私钥最简单的方法是使用浏览器创建。

选择DNS验证比较方便,只需要添加指定的DNS解析就可以了,这里是选择DNS验证后freessl.cn给出的要求。

image.png

下面是腾讯云DNSPod的DNS解析中添加该TXT记录的配置。

image.png

添加成功后可以返回freessl.cn点击验证按钮,一般来说添加成功后很快就可以生效。

验证通过后,马上可以获得证书,包括CA证书,证书和私钥三个部分。其中主要使用证书和私钥。

2020总结

目录
  1. 在学校
  2. 实习
  3. 工作的抉择
  4. 读书

青龙隐深潭,灵龟弃荒驿。
故园去千里,南洋观朵颐。
年少多沾恩,空负凌云志。
独自登高处,飘零十年归。

——2020年11月8日

迟来的总结总比没有好些。

疫情更暴露了西方反动势力宣扬的所谓“自由”世界价值观的虚伪。但中国今天的安定环境和蓬勃发展的形势都是革命先辈们的努力所创造的,并且我相信这不会是一劳永逸的。不论是国家还是个人都应该永远实事求是,坚持不懈地追求真理,为自己的目标奋斗。唯有付出艰辛的努力才能获得有价值的成就。

整个2020年都住在学校,只有一次离开北京,这一年我完成了毕业论文的主体内容,完成了实习并选择了毕业后的工作,很多事情当时没有想得明白,但是一直有人默默给我无私的帮助,帮助我做的更好,我不能不感谢他们,我到目前所取得的种种进展实在是因为他们的帮助和我的好运气,而我自己的努力实在是微不足道的。每每想到这些,我总很会内疚,以后一定要脚踏实地,实事求是,更多的依靠自己的努力去创造,也应该尽力去帮助有需要的人。

这一年过得艰难,一直在处理紧迫的事情,几乎没有能放松的时间,但做事又没有任何效率可言,大半年窝在宿舍,动不动就偷懒,简直不忍回顾。

在学校

机缘巧合,决定2019年寒假留校,却没想到疫情愈演愈烈,从大概过年后开始封校,一直到2020年9月开学,很长的一段时间内学10公寓15层只有我们两个人。公寓的马老师,张老师还有几位其他老师常常会来转,我们下去也总会看到他们值班。还有食堂的工作人员。其余就几乎不再与人接触。

科研楼几乎都在封闭中,我及时把实验室电脑的硬盘拆下来拿到宿舍,所以封锁并没有太影响我的工作进度。寒假的时间过得很快,我买了瑜伽垫开始运动,还有弹吉他和看书,开始过的还充实,但自从开始吃饭的时候看B站,就变得很拖沓。之前我几乎不看B站。

实际上这段时间一直很焦虑,寒假里跟师兄学NLP,做论文,跑实验,感觉很有压力,师兄的思路清晰,提出各种方案,给我找参考资料,疯狂读论文,帮我找实验代码里的bug,还有在几天内写了初稿,又各种修改和更新,操作让我目不暇接,而我总是慢了半拍,直到今天想想还是很紧张,然而我还是会偷懒,有时候遇到困难也没有积极解决,想来十分愧疚,做的贡献实在微不足道。希望优秀的师哥今年能顺利完成自己的目标。

寒假结束后就,一直在远程开组会,同时暑期实习的春招也开始,疯狂笔试面试,虽然准备的乱七八糟,却幸运的得到了很好的机会。

实习

我能遇到yang哥真的非常幸运,拿到实习offer的时候是我半年来最开心的时候。之前一直很压抑。结果实习开始才发现这里压力很大,远远不是我之前想想的那种慢节奏的生活。而且yang哥不仅优秀而且努力,我仍然是目不暇接,而且在宿舍工作很容易偷懒,而且实习还需要用Windows系统,总忍不住偷偷玩英雄无敌III,之前从没有在战役中打过这么多关卡。

实习的收获很大,学习了工作和处理问题的方法,让我大开眼界,还有英语,我的英语实在不好,开会的时候yang哥常常帮我打圆场,一看到我被问就出来救我。

进步总是需要有压力。但我本来是想找个轻松的实习和轻松的工作。

工作的抉择

最纠结的时候问了很多人的意见。占得“颐”挂,查了好多资料,感觉还是不应该贸然离家太远。而且应该懂得知足和感恩,而不是只看到当前的利益。

读书

高尔基的《母亲》,是在下半年结束实习后在实验室读的,买了多年,放在实验室一直没有拆封。从一个不幸的工人家庭的视角展现俄国无产阶级的革命斗争。生活的重担没有压垮母亲,反而让她更加坚强,从

重读《万里十五年》并且找到了一个英文版的pdf,希望能通过阅读学习英语。在本科的时候,姚老师就跟我们推荐过《万历十五年》等书,并且还告诉我们这个书是先有英文版再有中文版,但我之前并没有找到可用的英文版。

gcn-bitcoin

目录

论文:Anti-Money Laundering in Bitcoin: Experimenting with Graph Convolutional Networks for Financial Forensics

代码:

  1. GCN_Elliptic_dataset/Elliptic_dataset_GCN.ipynb at main · JungWoo-Chae/GCN_Elliptic_dataset (github.com)
  2. https://github.com/as5845131421/NMlab_final-Anti-Money-Laundering-in-Bitcoin/

数据:Elliptic Data Set | Kaggle

环境:PyTorch 1.7.1 + torch_geometric-1.6.3-cp36-none-any.whl + CUDA 10.2 + RTX 2080Ti

rusty1s/pytorch_geometric: Geometric Deep Learning Extension Library for PyTorch (github.com)

https://pytorch-geometric.readthedocs.io/en/latest/

nmcli连接WPA2 802.1X的无线网(用户名+密码)

目录

玩客云刷机为armbian后,使用了一个TP-LINK的TL-WN826N(ver 1.0)的无线网卡可以免驱使用。之前试了(TL-WN821N和360随身WIFI1都不行)。

希望在命令模式下用nmcli连接wifi。学校的wifi是需要用户名和密码才能登录的。使用命令

1
nmcli dev wifi

扫描wifi发现加密方式是:

  • SSID MODE CHAN RATE SIGNAL BARS SECURITY

XXXX-mobile Infra 11 54 Mbit/s 50 ▂▄__ WPA2 802.1X

只查到使用密码登录的方式是:

1
nmcli device wifi connect SSID password PASSWD

后来终于找到 WPA2 802.1X 需要的命令(参考资料

1
nmcli connection add type wifi con-name NAME ifname wlan0 ssid SSID -- wifo-sec.key-mgmt wpa-eap 802-1x.eap ttls 802-1x.phase2-auth mschapv2 802-1x.identity USERNAME

第一次登录的时候需要额外使用 --ask 参数输入密码

1
nmcli --ask connection up NAME

这时会要求输入密码

牛客编程巅峰赛S2第5场Python解法

目录
  1. 第一题
    1. 代码
  2. 第二题
    1. 示例1
      1. 返回值
    2. 示例2
      1. 返回值
    3. 示例3
      1. 返回值
    4. 代码
  3. 第三题
    1. 示例1
      1. 返回值
    2. 示例2
      1. 返回值
    3. 代码

https://ac.nowcoder.com/acm/contest/9556

这次题目比周末的简单。

第一题

链接:https://ac.nowcoder.com/acm/contest/9556/A

给你一个含有n个元素的数组arr[i],请你告诉牛牛这个数组的中位数大还是平均数大,如果中位数更大输出1,如果平均数更大输出-1,如果中位数和平均数相等输出0

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution:
def Answerofjudge(self , arr ):
# write code here
arr.sort()
s = sum(arr)
av = s / len(arr)
i = len(arr) >> 1
if len(arr) % 2 == 1:
x = arr[i]
else:
x = (arr[i] + arr[i-1]) / 2
if abs(x - av) < 1e-7:
return 0
elif av > x:
return -1
return 1

排序,算平均数和中位数

第二题

链接:https://ac.nowcoder.com/acm/contest/9556/B

牛牛非常怕他的女朋友,怕到了走火入魔的程度,以至于每当他看到一个字符串同时含有n,p,y三个字母他都害怕的不行。现在有一个长度为m的只包含小写字母‘a’-‘z’的字符串x,牛牛想知道能令他不害怕的最长子串的长度是多少。(对于字符串”abc”来说,”c”,”ab”都是原串的子串,但”ac”不是原串子串)

示例1

1
"abcdefghijklmn"

返回值

1
14

示例2

1
"ynp"

返回值

1
2

示例3

1
"ypknnbpiyc"

返回值

1
7

代码

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
class Solution:
def Maximumlength(self , x ):
# write code here
d = {'n': 0, 'p': 0, 'y': 0} # 统计当前窗口内的三个字母数量
l, r = 0, 0 # 窗口左右指针
ans = 0 # 窗口最大值
f = False # 当前窗口内是否同时出现三种字母
c = 0
while l < len(x) and r < len(x):
if not f:
if x[r] in 'npy':
if d[x[r]] == 0:
c += 1
if c == 3:
f = True
d[x[r]] += 1
r += 1
else:
if x[l] in 'npy':
if d[x[l]] == 1:
c -= 1
f = False
d[x[l]] -= 1
l += 1
if not f:
ans = max(ans, r - l)
return ans

滑动窗口,l 是起始位置,r是终止位置,r - l 是窗口大小(即当前字符串长度)

第三题

链接:https://ac.nowcoder.com/acm/contest/9556/C

给定牛牛一个后缀表达式s,计算它的结果,例如,1+1对应的后缀表达式为1#1#+,‘#’作为操作数的结束符号。

其中,表达式中只含有‘+’、’-‘、’*‘三种运算,不包含除法。

本题保证表达式一定合法,且计算过程和计算结果的绝对值一定不会超过101810^{18}1018

示例1

1
"1#1#+"

返回值

1
2

示例2

1
"12#3#+15#*"

返回值

复制;)

1
225

代码

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
class Solution:
def solve(self , str ):
# write code here
# 解析后缀表达式
x = str.split('#')
xx = []
for p in x:
while len(p) != 1 and not p.isdigit(): # 判断是否粘连 ++ 或者 ++3 类似的情况
xx.append(p[0])
p = p[1:]
xx.append(p)
x = xx
# 后缀表达式求值
ns = [] # 操作数栈
for p in x:
if p.isdigit():
ns.append(int(p)) # 入栈
else:
o1 = ns.pop() # 出栈
o2 = ns.pop()
if p == '+':
a = o1 + o2
elif p == '-':
a = o2 - o1
else:
a = o2 * o1
ns.append(a) # 运算结果入栈
return ns[0]

先按照 ‘#’ split 字符串,这时候可能有 符号 + 操作数 或者 符号 + 符号黏在一起的情况。例如 “1#1#1#1#+++”,这里需要依次处理 split 后的每个元素。只要元素长度大于 1 且不是数字,就一定是粘连的情况,这时候第一个字符必然是符号,把符号取下来,继续验证是否粘连,直到没有粘连。