常用正则

1
2
3
$ grep -n "^$" test.txt # 空白行
[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} # yyyy-mm-dd
[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\} # ip

在vi中按Esc键后d G可以清空光标起的所有内容。

字符截取命令

cut命令

例如我们有用户信息文件/etc/passwd,

1
2
$ useradd user1
$ useradd user2

假设我们要删除上面创建的用户user1和user2,当然我们可以使用userdel命令,但是有的时候是程序执行的,所以我们需要在/etc/passwd中提取出新创建的2个普通用户,使用grep进行行提取

1
2
3
$ grep "user" /etc/passwd | grep -v "system" # -v表示取反
user1:x:1001:1001::/home/user1:
user2:x:1002:1002::/home/user2:

接下来我们看下cut命令进行列提取,假设有以下的csv文件(注意:分隔符号是制表符):

1
2
3
4
id      name    gender  mark
1 furong f 85
2 fengj f 60
3 cang f 70
1
2
$ cut -f 2 students.csv # 截取第二列(name)
$ cut -f 2,4 students.csv # 截取name和mark

再回到上一个从/etc/passwd中截取用户名的程序中,我们只需要这样:

1
$ grep "user" /etc/passwd | grep -v "system" | cut -f 1 -d ":" # -d指明分隔符

提取用户名和uid

1
$ cut -d ":" -f 1,3 /etc/passwd
1
$ printf '%s\t%s\t%s\t%s\n'  $(cat student.csv) # 使用printf输出student.csv中的内容

awk命令

awk '条件1{动作1}条件2{动作2}...' 文件名

  • 条件(Pattern):一般使用关系表达式,例如:x>10,x>=10
  • 动作(Action):格式化输出或者流程控制语句
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
$ awk '{printf $2 "\t" $4 "\n"}' student.csv # 输出第2和4列
name mark
furong 85
fengj 60
cang 70
$ df -h | awk '{print $1 "\t" $3}' # 输出df -h命令的第一列和第三列
文件系统 已用
/dev/sda8 20G
none 0
udev 4.0K
tmpfs 1.2M
none 0
none 40M
none 56K
$ df -h | grep "/dev/sda8" | awk '{print $1 "\t" $5}'
/dev/sda8 21%
$ df -h | grep "/dev/sda8" | awk '{print $5}' | cut -f 1 -d "%"
21

# BEGIN和END用于在整个文件的前面或者后面输出某个内容
$ awk 'BEGIN{print "---the begin---"}END{print "---the end---"}{printf $2 "\t" $4 "\n"}' student.csv
---the begin---
name mark
furong 85
fengj 60
cang 70
---the end---
# 使用awk命令输出用户名和uid
$ cat /etc/passwd | awk '{FS=":"}{print $1 "\t" $3}'
# 输出student.csv中成绩大于70的学生姓名(中间的grep -v表示去掉表头表示的行)
$ cat student.csv | grep -v id | awk '$4 >= 70 {printf $2 "\n"}'

awk中$0表示的是文件名,awk的执行是按照进行提取,把每一个数据变换成$1,$2,$3等字段,然后判断Pattern,条件满足则执行Action接下来是第二行,以此类推.

sed命令

文本替换和过滤的流式编辑器

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
# sed中-n选项的作用,不加-n则不仅打印匹配的行而且打印整篇文档
consoles@linux:~$ sed '2p' student.csv
id name gender mark
1 furong f 85
1 furong f 85
2 fengj f 60
3 cang f 70
consoles@linux:~$ sed -n '2p' student.csv
1 furong f 85
$ sed '2d' student.csv # 从原始数据中过滤掉第2行
id name gender mark
2 fengj f 60
3 cang f 70
$ sed '2,4d' student.csv # 从原始数据中过滤掉第2到4行
id name gender mark
$ sed '2a 漂亮就是任性' student.csv # 在第二行后面追加(如果选项是i则表示在前面插入)
id name gender mark
1 furong f 85
漂亮就是任性
2 fengj f 60
3 cang f 70
$ sed '4c 苍老师成绩不及格' student.csv # 替换第四行
id name gender mark
1 furong f 85
2 fengj f 60
3 cang f 70
$ sed '4s/70/100/g' student.csv # 将苍老师的成绩改为满分,我们可以使用`sed -i`将操作保存到硬盘
id name gender mark
1 furong f 85
2 fengj f 60
3 cang f 100

Unix Domain Socket用于IPC(同一台主机间的进程通信),不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。UNIX Domain Socket有SOCK_DGRAM或SOCK_STREAM两种工作模式,类似于UDP和TCP,但是面向消息的UNIX Domain Socket也是可靠的,消息既不会丢失也不会顺序错乱。

UNIX Domain Socket可用于两个没有亲缘关系的进程,是全双工的,是目前使用最广泛的IPC机制,比如X Window服务器和GUI程序之间就是通过UNIX Domain Socket通讯的。使用node可以创建Unix Domain Server

文件查找

1
$ find /usr -name "redis.conf"

buffer和cache

这两个术语经常被混用,原因在于他们都在内存中可以提高IO性能。但是严格来说buffer是用于存放要输出到disk(块设备)的数据的,而cache是存放从disk上读出的数据。