Linux常用命令

本文总结一些在开发中常用到的Linux命令。

1. vim

vim命令用于编辑文件。

普通模式(命令行模式)

1
2
3
4
5
6
7
8
9
set number/set nu:vim时显示行号 或通过修改vim的配置文件使得每次vim时都显示行号
HOME:快速移动到当前行首部
END:快速移动到当前行尾部
w:移动到下一个单词
b:移动到上一个单词
:+行号+回车:快速移动到某一行
:+$+回车:快速移动到最后一行
dd:删除当前行
dj:删除当前行和下一行

由普通模式进入插入模式

1
2
3
4
5
i:在当前光标处进行编辑
I:在行首插入
A:在行尾插入
o:在当前行后插入一个新行
O:在当前行前插入一个新行

由插入模式进入普通模式

1
ESC

2. grep

grep命令用于查找文件里符合条件的字符串。

1
2
3
4
5
6
7
8
9
10
11
以nba.txt文件为例:
cat nba.txt | grep "curry":查找nba.txt中包含curry字符串的所有行并返回
cat nba.txt | grep "curry" -v:查找nba.txt中不包含curry字符串的所有行并返回(第一条的取反)
cat nba.txt | grep "CuRry" -i:忽略大小写
cat nba.txt | grep "curry" -n:显示匹配到的行号
cat nba.txt | grep "curry" -c:统计匹配到的结果行数,不显示搜索结果
cat nba.txt | grep "curry" -o:仅显示匹配到的字符串
cat nba.txt | grep "curry" -A n:显示搜索行及其向下相邻的n行
cat nba.txt | grep "curry" -B n:显示搜索行及其向上相邻的n行
cat nba.txt | grep "curry" -C n:显示搜索行及其向上和向下相邻的n行
cat nba.txt | grep "curry" -w:匹配整个单词,区分大小写

3. awk

awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息。通常,awk是以文件的一行为处理单位的。

3.1 调用awk

有三种方式可以调用awk:

1
2
3
4
5
6
7
8
9
10
11
12
13
A.命令行方式
awk [-F field-separator] 'commands' input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s)是待处理的文件。
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。

B.shell脚本方式
将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,通过键入脚本名称来调用。
相当于shell脚本首行的:#!/bin/sh
可以换成:#!/bin/awk

C.将所有的awk命令插入一个单独文件,然后调用:
awk -f awk-script-file input-file(s)
其中,-f选项加载awk-script-file中的awk脚本,input-file(s)是待处理的文件。

3.2 awk命令

awk工作流程:读入有’\n’换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是”空白键” 或 “[tab]键”。

1
2
3
4
5
6
7
8
9
10
11
12
13
以awk.txt文件为例,文件内容如下:
root pts/1 192.168.1.100 Tue Feb 10 11:21 still logged in
root pts/1 192.168.1.100 Tue Feb 10 00:46 - 02:28 (01:41)
root pts/1 192.168.1.100 Mon Feb 9 11:41 - 18:30 (06:48)
dmtsai pts/1 192.168.1.100 Mon Feb 9 11:41 - 11:41 (00:00)
root tty1 Fri Sep 5 14:09 - 14:10 (00:01)

[root@slave1 data]# cat awk.txt | awk '{print $1}'
root
root
root
dmtsai
root

下面以/etc/passwd文件为例:

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
-F是指定分隔符,head -5只查看前五行
[root@slave1 data]# cat /etc/passwd | awk -F ':' '{print $1}' | head -5
root
bin
daemon
adm
lp

在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh",tail -5只查看后五行
[root@slave1 data]# cat /etc/passwd | awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}' | tail -5
name,shell
root,/bin/bash
daemon,/bin/sh
bin,/bin/sh
sys,/bin/sh
root,/bin/sh
blue,/bin/nosh

搜索/etc/passwd有root关键字的所有行
[root@slave1 data]# awk -F: '/root/' /etc/passwd
等价于:awk -F ':' '/root/' /etc/passwd
等价于:cat /etc/passwd | awk -F ':' '/root/'
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

搜索/etc/passwd有root关键字的所有行,并显示对应的shell
[root@slave1 data]# awk -F: '/root/{print $7}' /etc/passwd
/bin/bash
/sbin/nologin

3.3 awk内置变量

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
ARGC               命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
$0变量是指整条记录
$1表示当前行的第一个域
$2表示当前行的第二个域,以此类推

统计/etc/passwd:文件名,每行的行号,每行的列数,对应的第三个域的内容
[root@slave1 data]# awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$3}' /etc/passwd | head -5
filename:/etc/passwd,linenumber:1,columns:7,linecontent:0
filename:/etc/passwd,linenumber:2,columns:7,linecontent:1
filename:/etc/passwd,linenumber:3,columns:7,linecontent:2
filename:/etc/passwd,linenumber:4,columns:7,linecontent:3
filename:/etc/passwd,linenumber:5,columns:7,linecontent:4

可以用printf替代print,可以让代码更加简洁,易读:
[root@slave1 data]# awk -F ':' '{printf("filename:%s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd | head -5

3.4 awk编程

除了awk的内置变量,awk还可以自定义变量。

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
统计/etc/passwd的账户人数:
[root@slave1 data]# awk '{count++;print $0;} END {print "user count is", count}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
mysql:x:998:1000::/home/mysql:/bin/bash
es:x:1000:1001::/home/es:/bin/bash
user count is 21

统计当前文件夹下的文件占用的字节数: (注意,统计不包括文件夹的子目录)
[root@slave1 data]# ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END {print "[end] size is", size}'
[end] size is 36

4. sed

sed的作用就是实现对文件的 “ 增删改查 ” 。

sed遵循简单的工作流:

  1. 读取(从输入中读取某一行)
  2. 执行(在某一行上执行sed命令)
  3. 显示(把结果显示在输出中)

默认是显示修改后内容,不会修改原文件,除非使用-i 参数

1
2
3
4
5
6
7
8
9
10
11
12
13
sed [-nefri] 'command' test.txt 
-e:可以指定多个命令
-f:指定命令文件
-n:取消默认控制台输出,与p一起使用可打印指定内容
-i:输出到原文件,静默执行(修改原文件的意思)
-r:Sed使用扩展正则
command:
a 新增
c 替换
d 删除
i 插入
p 打印,要与-n参数一起使用
s 替换(局部匹配替换)

新增 a

1
2
sed '2a testContent' test.txt:在第 2 行后面新增一行内容
sed '1,3a testContent' test.txt:在原文的第 1~3 行后面各新增一行内容

替换 c

1
2
sed '2c testContent' test.txt:将第 2 行内容整行替换
sed '1,3c testContent' test.txt:将第 1~3 行内容替换成一行指定内容

删除 d

1
2
sed '2d' test.txt:删除第 2 行
sed '1,3d' test.txt:删除第 1~3 行

插入 i

1
2
sed '2i testContent' test.txt:在第 2 行前面插入一行内容
sed '1,3i testContent' test.txt:在原文的第 1~3 行前面各插入一行内容

打印 p

1
2
3
4
5
6
7
sed '2p' test.txt:重复打印第 2 行
sed '1,3p' test.txt:重复打印第 1~3 行
sed -n '2p' test.txt:只打印第 2 行
sed -n '1,3p' test.txt:只打印第 1~3 行
sed -n '/user/p' test.txt:打印匹配到user的行,类似grep
sed -n '/user/!p' test.txt:!反选,打印没有匹配到user的行
sed -n 's/old/new/gp' test:只打印匹配替换的行

替换 s

1
2
3
sed 's/old/new/' test.txt:匹配每一行的第一个old替换为new
sed 's/old/new/gi' test.txt:匹配所有old替换为new,g 代表一行多个,i 代表匹配忽略大小写
sed '3,9s/old/new/gi' test.txt:匹配第 3~9 行所有old替换为new

参数 -e

1
sed -e 's/aaa/bbb/g' -e '2d' test.txt:执行多个指令

参数 -f

1
sed -f ab.log test.txt:多个命令写进ab.log文件里,一行一条命令,效果同-e,文件的内容就是多行sed命令
坚持原创技术分享,您的支持将鼓励我继续创作!

------本文结束 感谢您的阅读------