目录

Shell常用命令使用说明

文件属性

chattr 命令用于改变文件属性 这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下8种模式:

  • a:让文件或目录仅供附加用途。
  • b:不更新文件或目录的最后存取时间。
  • c:将文件或目录压缩后存放。
  • d:将文件或目录排除在倾倒操作之外。
  • i:不得任意更动文件或目录。
  • s:保密性删除文件或目录。
  • S:即时更新文件或目录。
  • u:预防意外删除。

语法

1
chattr [-RV][-v<版本编号>][+/-/=<属性>][文件或目录...]

参数

  • -R 递归处理,将指定目录下的所有文件及子目录一并处理。
  • -v<版本编号> 设置文件或目录版本。
  • -V 显示指令执行过程。
  • +<属性> 开启文件或目录的该项属性。
  • -<属性> 关闭文件或目录的该项属性。
  • =<属性> 指定文件或目录的该项属性。

实例

1
2
3
4
5
6
7
# 不能改动文件
chattr +i /etc/resolv.conf
# 查看权限
lsattr /etc/resolv.conf
----i-------- /etc/resolv.conf
# 只能追加不能删除
chattr +a /var/log/messages

uniq

uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。 uniq 可检查文本文件中重复出现的行列

语法

1
uniq [-cdu][-f<栏位>][-s<字符位置>][-w<字符位置>][--help][--version][输入文件][输出文件]

参数

  • -c或–count 在每列旁边显示该行重复出现的次数。
  • -d或–repeated 仅显示重复出现的行列。
  • -f<栏位>或–skip-fields=<栏位> 忽略比较指定的栏位。
  • -s<字符位置>或–skip-chars=<字符位置> 忽略比较指定的字符。
  • -u或–unique 仅显示出一次的行列。
  • -w<字符位置>或–check-chars=<字符位置> 指定要比较的字符。
  • –help 显示帮助。
  • –version 显示版本信息。
  • [输入文件] 指定已排序好的文本文件。如果不指定此项,则从标准读取数据;
  • [输出文件] 指定输出的文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)。

实例

 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
39
40
41
42
43
44
45
46
47
48
# 删除重复行
cat << EOF | uniq -c
test 30  
test 30  
test 30  
Hello 95  
Hello 95  
Hello 95  
Hello 95  
Linux 85  
Linux 85
EOF
      3 test 30  
      4 Hello 95  
      1 Linux 85  
      1 Linux 85
# 排序删除
cat << EOF | sort |uniq -c
test 30  
test 30  
test 30  
Hello 95  
Hello 95  
Hello 95  
Hello 95  
Linux 85  
Linux 85
EOF
      4 Hello 95  
      1 Linux 85
      1 Linux 85  
      3 test 30 
# 找出重复行
cat << EOF |uniq -d
test 30  
test 30  
test 30  
Hello 95  
Hello 95  
Hello 95  
Hello 95  
Linux 85  
Linux 85
Linux 85
EOF
test 30  
Hello 95  
Linux 85

cut命令使用

Linux cut命令用于显示每行从开头算起 num1 到 num2 的文字

语法

1
2
3
cut  [-bn] [file]
cut [-c] [file]
cut [-df] [file]

参数

  • -b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
  • -c :以字符为单位进行分割。
  • -d :自定义分隔符,默认为制表符。
  • -f :与-d一起使用,指定显示哪个区域。
  • -n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的 范围之内,该字符将被写出;否则,该字符将被排除

实例

1、以字节定位

1
2
who|cut -b 3
o

2、以字符定位

1
2
who|cut -c 3
t

3、自定义分隔符

1
2
3
4
5
6
cat /etc/passwd|head -n 5|cut -d : -f 1,3-5
root:0:0:root
bin:1:1:bin
daemon:2:2:daemon
adm:3:4:adm
lp:4:7:lp

sort命令使用

Linux sort 命令用于将文本文件内容加以排序。

sort 可针对文本文件的内容,以行为单位来排序

语法

1
sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件][-k field1[,field2]]

参数

  • -b 忽略每行前面开始出的空格字符。
  • -c 检查文件是否已经按照顺序排序。
  • -d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
  • -f 排序时,将小写字母视为大写字母。
  • -i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。
  • -m 将几个排序好的文件进行合并。
  • -M 将前面3个字母依照月份的缩写进行排序。
  • -n 依照数值的大小排序。
  • -u 意味着是唯一的(unique),输出的结果是去完重了的。
  • -o<输出文件> 将排序后的结果存入指定的文件。
  • -r 以相反的顺序来排序。
  • -t<分隔字符> 指定排序时所用的栏位分隔字符。
  • +<起始栏位>-<结束栏位> 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
  • –help 显示帮助。
  • –version 显示版本信息。
  • [-k field1[,field2]] 按指定的列进行排序。

实例

1、直接排序

1
2
3
4
5
6
7
8
cat << EOF | sort
test 30  
Hello 95  
Linux 85
EOF
Hello 95  
Linux 85
test 30

2、使用 -k 参数设置对第二列的值进行重排

1
2
3
4
5
6
7
8
cat << EOF | sort -k 2
test 30  
Hello 95  
Linux 85
EOF
test 30  
Linux 85
Hello 95

3、使用 -r 进行倒序排序

1
2
3
4
5
6
7
8
cat << EOF | sort -r
test 30  99
Hello 95  76
Linux 85 35
EOF
test 30  99
Linux 85 35
Hello 95  76

grep命令使用

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

grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据

语法

1
grep [-abcEFGhHilLnqrsvVwxy][-A<显示行数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]

参数

  • -a 或 –text : 不要忽略二进制的数据。
  • -A<显示行数> 或 –after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
  • -b 或 –byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
  • -B<显示行数> 或 –before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
  • -c 或 –count : 计算符合样式的列数。
  • -C<显示行数> 或 –context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
  • -d <动作> 或 –directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
  • -e<范本样式> 或 –regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
  • -E 或 –extended-regexp : 将样式为延伸的正则表达式来使用。
  • -f<规则文件> 或 –file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
  • -F 或 –fixed-regexp : 将样式视为固定字符串的列表。
  • -G 或 –basic-regexp : 将样式视为普通的表示法来使用。
  • -h 或 –no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
  • -H 或 –with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。
  • -i 或 –ignore-case : 忽略字符大小写的差别。
  • -l 或 –file-with-matches : 列出文件内容符合指定的样式的文件名称。
  • -L 或 –files-without-match : 列出文件内容不符合指定的样式的文件名称。
  • -n 或 –line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
  • -o 或 –only-matching : 只显示匹配PATTERN 部分。
  • -q 或 –quiet或–silent : 不显示任何信息。
  • -r 或 –recursive : 此参数的效果和指定"-d recurse"参数相同。
  • -s 或 –no-messages : 不显示错误信息。
  • -v 或 –invert-match : 显示不包含匹配文本的所有行。
  • -V 或 –version : 显示版本信息。
  • -w 或 –word-regexp : 只显示全字符合的列。
  • -x –line-regexp : 只显示全列符合的列。
  • -y : 此参数的效果和指定"-i"参数相同。

实例

1、查询匹配字符的文件

1
2
3
cat /etc/passwd |grep root
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

2、查询匹配字符前一行

1
2
3
4
5
cat /etc/passwd |grep root -B 1
root:x:0:0:root:/root:/bin/bash
--
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

3、查询匹配字符后一行

1
2
3
4
5
6
cat /etc/passwd |grep root -A 1
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
--
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin

4、查询匹配字符前后一行

1
2
3
4
5
6
7
cat /etc/passwd |grep root -C 1
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
--
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

5、查询匹配以op开头的行

1
2
cat /etc/passwd |grep ^op
operator:x:11:0:operator:/root:/sbin/nologin

6、查询匹配以bash结尾的行

1
2
3
cat /etc/passwd | grep bash$
root:x:0:0:root:/root:/bin/bash
devops:x:1000:1000::/home/devops:/bin/bash

sed命令使用

Linux sed 命令是利用脚本来处理文本文件。 sed 可依照脚本的指令来处理、编辑文本文件。 Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。

语法

1
sed [-hnV][-e<script>][-f<script文件>][文本文件]

参数

1
2
3
4
5
-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
-h或--help 显示帮助。
-n或--quiet或--silent 仅显示script处理后的结果。
-V或--version 显示版本信息。

动作

  • a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
  • c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
  • d :删除,因为是删除啊,所以 d 后面通常不接任何东东;
  • i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
  • s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦

sed元字符

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
- ^ # 匹配行开始,如:/^sed/匹配所有以sed开头的行。
- $ # 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
- . # 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
- * # 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
- [] # 匹配一个指定范围内的字符,如/[sS]ed/匹配sed和Sed。  
- [^] # 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
- \(..\) # 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
- & # 保存搜索字符用来替换其他字符,如s/love/ **&** /,love这成 **love** 。
- \< # 匹配单词的开始,如:/\<love/匹配包含以love开头的单词的行。
- \> # 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。
- x\{m\} # 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。
- x\{m,\} # 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。
- x\{m,n\} # 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。 

实例

1、像文本中添加一行

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
cat << EOF > testfile | sed -e 4a\newLine testfile
HELLO LINUX!  
Linux is a free unix-type opterating system.  
This is a linux testfile!  
Linux test 
Google
Taobao
Runoob
Tesetfile
Wiki
EOF
HELLO LINUX!  
Linux is a free unix-type opterating system.  
This is a linux testfile!  
Linux test 
newLine
Google
Taobao
Runoob
Tesetfile
Wiki

2、删除其中的几行

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
cat << EOF | nl | sed '2,5d'
HELLO LINUX!  
Linux is a free unix-type opterating system.  
This is a linux testfile!  
Linux test 
Google
Taobao
Runoob
Tesetfile
Wiki
EOF
     1	HELLO LINUX!  
     6	Taobao
     7	Runoob
     8	Tesetfile
     9	Wiki

3、全量替换

1
sed -i 's/book/books/g' file

find命令使用

Linux find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示

语法

1
find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;

参数

  • -mount, -xdev : 只检查和指定目录在同一个文件系统下的文件,避免列出其它文件系统中的文件
  • -amin n : 在过去 n 分钟内被读取过
  • -anewer file : 比文件 file 更晚被读取过的文件
  • -atime n : 在过去 n 天内被读取过的文件
  • -cmin n : 在过去 n 分钟内被修改过
  • -cnewer file :比文件 file 更新的文件
  • -ctime n : 在过去 n 天内创建的文件
  • -mtime n : 在过去 n 天内修改过的文件
  • -empty : 空的文件-gid n or -group name : gid 是 n 或是 group 名称是 name
  • -ipath p, -path p : 路径名称符合 p 的文件,ipath 会忽略大小写
  • -name name, -iname name : 文件名称符合 name 的文件。iname 会忽略大小写
  • -size n : 文件大小 是 n 单位,b 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组。
  • -type c : 文件类型是 c 的文件。 d: 目录 c: 字型装置文件 b: 区块装置文件 p: 具名贮列 f: 一般文件 l: 符号连结

实例

1、查询当前目录及其子目录中所有以"xxx"结尾的文件

1
find . -name "*.log"

2、将当前目录及其子目录中的所有文件列出

1
find . -type -f

3、将当前目录及其子目录下所有最近 20 天内更新过的文件列出

1
find . -ctime 20

4、将当前目录及其子目录下所有最近 20 天内访问过的文件列出

1
find . -atime 20

5、查找 /var/log 目录中更改时间在 7 日以前的普通文件,并在删除之前询问它们

1
find /var/log -type f -mtime +7 -ok rm {} \;

6、查找当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件

1
find . -type f -perm 644 -exec ls -l {} \;

7、查找超过10MB的所有.mp3文件,并使用一个命令删除它们

1
find . -type f -name "*.mp3" -size +10m -exec rm -rf {} \;

8、找到大于50MB且小于100MB的所有文件

1
find . -type f -size +50m -size -100m

jq命令使用

jq 是 stedolan 开发的一个轻量级的和灵活的命令行JSON处理器,源码请参考 jq 项目主页 jq 用于处理JSON输入,将给定过滤器应用于其JSON文本输入并在标准输出上将过滤器的结果生成为JSON。 最简单的过滤器是.,它将jq的输入未经修改地复制到其输出中(格式设置除外)

语法

1
2
3
jq [options] <jq filter> [file...]
jq [options] --args <jq filter> [strings...]
jq [options] --jsonargs <jq filter> [JSON_TEXTS...]

参数

  • -c 紧凑而不是漂亮的输出;
  • -n 使用null作为单个输入值;
  • -e 根据输出设置退出状态代码;
  • -s 将所有输入读取(吸取)到数组中;应用过滤器;
  • -r 输出原始字符串,而不是JSON文本;
  • -R 读取原始字符串,而不是JSON文本;
  • -C 为JSON着色;
  • -M 单色(不要为JSON着色);
  • -S 在输出上排序对象的键;
  • –tab 使用制表符进行缩进;
  • –arg a v 将变量$a设置为value;
  • –argjson a v 将变量$a设置为JSON value;
  • –slurpfile a f 将变量$a设置为从读取的JSON文本数组;
  • –rawfile a f 将变量$a设置为包含内容的字符串;
  • –args 其余参数是字符串参数,而不是文件;
  • –jsonargs 其余的参数是JSON参数,而不是文件;
  • – 终止参数处理;

实例

有一json文件(test.json)内容如下,使用jq做相关数据提出

 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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
{
    "apiVersion": "v1",
    "kind": "Service",
    "metadata": {
        "annotations": {
            "meta.helm.sh/release-name": "prometheus",
            "meta.helm.sh/release-namespace": "kube-system"
        },
        "creationTimestamp": "2022-05-05T09:19:16Z",
        "labels": {
            "app": "prometheus",
            "app.kubernetes.io/managed-by": "Helm",
            "chart": "prometheus-11.12.1",
            "component": "server",
            "heritage": "Helm",
            "release": "prometheus"
        },
        "managedFields": [
            {
                "apiVersion": "v1",
                "fieldsType": "FieldsV1",
                "fieldsV1": {
                    "f:metadata": {
                        "f:annotations": {
                            ".": {},
                            "f:meta.helm.sh/release-name": {},
                            "f:meta.helm.sh/release-namespace": {}
                        },
                        "f:labels": {
                            ".": {},
                            "f:app": {},
                            "f:app.kubernetes.io/managed-by": {},
                            "f:chart": {},
                            "f:component": {},
                            "f:heritage": {},
                            "f:release": {}
                        }
                    },
                    "f:spec": {
                        "f:externalTrafficPolicy": {},
                        "f:ports": {
                            ".": {},
                            "k:{\"port\":80,\"protocol\":\"TCP\"}": {
                                ".": {},
                                "f:name": {},
                                "f:nodePort": {},
                                "f:port": {},
                                "f:protocol": {},
                                "f:targetPort": {}
                            }
                        },
                        "f:selector": {
                            ".": {},
                            "f:app": {},
                            "f:component": {},
                            "f:release": {}
                        },
                        "f:sessionAffinity": {},
                        "f:type": {}
                    }
                },
                "manager": "Go-http-client",
                "operation": "Update",
                "time": "2022-05-05T09:19:16Z"
            }
        ],
        "name": "prometheus-server",
        "namespace": "kube-system",
        "resourceVersion": "54247",
        "selfLink": "/api/v1/namespaces/kube-system/services/prometheus-server",
        "uid": "8eb54da5-f64e-4ea4-a5d1-2493bc1673cd"
    },
    "spec": {
        "clusterIP": "10.96.3.118",
        "externalTrafficPolicy": "Cluster",
        "ports": [
            {
                "name": "http",
                "nodePort": 31090,
                "port": 80,
                "protocol": "TCP",
                "targetPort": 9090
            }
        ],
        "selector": {
            "app": "prometheus",
            "component": "server",
            "release": "prometheus"
        },
        "sessionAffinity": "None",
        "type": "NodePort"
    },
    "status": {
        "loadBalancer": {}
    }
}

1、.key: 获取一个键的值

1
2
3
4
5
6
7
8
9
cat test.json | jq .metadata.lebels
{
  "app": "prometheus",
  "app.kubernetes.io/managed-by": "Helm",
  "chart": "prometheus-11.12.1",
  "component": "server",
  "heritage": "Helm",
  "release": "prometheus"
}

2、.[],[]: 获取一个数组

1
2
cat test.json | jq .metadata.managedFields[0].apiVersion
"v1"

3、keys: 获取数组中的键

1
2
3
4
5
6
7
8
9
cat test.json | jq '.metadata.managedFields[0]|keys'
[
  "apiVersion",
  "fieldsType",
  "fieldsV1",
  "manager",
  "operation",
  "time"
]

4、,: 使用过滤器

1
2
3
cat test.json | jq '.metadata.managedFields[0]|.manager,.time'
"Go-http-client"
"2022-05-05T09:19:16Z"

5、has: 判断是否存在某个key

1
2
cat test.json | jq '.metadata.managedFields[0]|has("name")'
false

6、{key}: 构造对象

1
2
3
4
cat test.json | jq '.metadata.managedFields[0].manager |{"name": .}'
{
  "name": "Go-http-client"
}

7、length: 查看元素个数

1
2
cat test.json | jq '.metadata.managedFields[0]|.manager,.time'
6

8、map(): 改变数组的值

1
cat test.json | jq '.metadata.managedFields[0]|.manager,.time|map_values(.+"ss")'

9、-r: 去除引号

1
2
3
cat test.json | jq -r '.metadata.managedFields[0]|.manager,.time'
Go-http-client
2022-05-05T09:19:16Z

awk

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。

语法

1
2
3
awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)

参数

  • -F fs or –field-separator fs 指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
  • -v var=value or –asign var=value 赋值一个用户定义变量。
  • -f scripfile or –file scriptfile 从脚本文件中读取awk命令。
  • -mf nnn and -mr nnn 对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
  • -W compact or –compat, -W traditional or –traditional 在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。
  • -W copyleft or –copyleft, -W copyright or –copyright 打印简短的版权信息。
  • -W help or –help, -W usage or –usage 打印全部awk选项和每个选项的简短说明。
  • -W lint or –lint 打印不能向传统unix平台移植的结构的警告。
  • -W lint-old or –lint-old 打印关于不能向传统unix平台移植的结构的警告。
  • -W posix 打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符=不能代替^和^=;fflush无效。
  • -W re-interval or –re-inerval 允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。
  • -W source program-text or –source program-text 使用program-text作为源代码,可与-f命令混用。
  • -W version or –version 打印bug报告信息的版本。

实例

1、文本匹配输出

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
cat << EOF | awk '{printf "%-8s %-10s\n",$1,$4}'
2 this is a test
3 Do you like awk
This's a test
10 There are orange,apple,mongo
EOF
2        a         
3        like      
This's             
10       orange,apple,mongo

2、指定分隔符文本匹配输出

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
cat << EOF | awk -F , '{print $1,$4}'
2 this is a test
3 Do you like awk
This's a test
10 There are orange,apple,mongo
EOF
2 this is a test 
3 Do you like awk 
This's a test 
10 There are orange

3、使用变量

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
cat << EOF | awk -va=1 '{print $1,$1+a}'
2 this is a test
3 Do you like awk
This's a test
10 There are orange,apple,mongo
EOF
2 3
3 4
This's 1
10 11

4、使用脚本

 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
39
40
41
42
43
44
45
46
47
48
49
# 创建awk脚本
cat << 'EOF' > test.awk
#!/bin/awk -f
#运行前
BEGIN {
    math = 0
    english = 0
    computer = 0
 
    printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL\n"
    printf "---------------------------------------------\n"
}
#运行中
{
    math+=$3
    english+=$4
    computer+=$5
    printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
END {
    printf "---------------------------------------------\n"
    printf "  TOTAL:%10d %8d %8d \n", math, english, computer
    printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}
EOF
# 使用脚本处理文件
cat << EOF | awk -f test.awk source
Marry   2143 78 84 77
Jack    2321 66 78 45
Tom     2122 48 77 71
Mike    2537 87 97 95
Bob     2415 40 57 62
EOF
NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL
---------------------------------------------
Marry  2143     78       84       77      239
Jack   2321     66       78       45      189
Tom    2122     48       77       71      196
Mike   2537     87       97       95      279
Bob    2415     40       57       62      159
Marry  2143     78       84       77      239
Jack   2321     66       78       45      189
Tom    2122     48       77       71      196
Mike   2537     87       97       95      279
Bob    2415     40       57       62      159
---------------------------------------------
  TOTAL:       638      786      700 
AVERAGE:     63.80    78.60    70.00

4、过滤第一列大于2的行

1
2
3
4
5
6
7
8
9
cat << EOF | awk '$1 >2'
2 this is a test
3 Do you like awk
This's a test
10 There are orange,apple,mongo
EOF
3 Do you like awk
This's a test
10 There are orange,apple,mongo

5、过滤第一列等于2的行

1
2
3
4
5
6
7
cat << EOF | awk '$1 ==2 {print $1,$3}'
2 this is a test
3 Do you like awk
This's a test
10 There are orange,apple,mongo
EOF
2 is

6、过滤第一列大于2并且第二列等于’Are’的行

1
2
3
4
5
6
7
cat << EOF | awk '$1>2 && $2=="Are" {print $1,$2,$3}'
2 this test
3 Are awk
This's a
10 There apple
EOF
3 Are awk

7、输出第二列包含 “th”,并打印第二列与第四列

1
2
3
4
5
6
7
cat << EOF | awk '$2 ~ /th/ {print $2,$4}'
2 this test
3 Are awk
This's a
10 There apple
EOF
this

8、忽略大小写

1
2
3
4
5
6
7
8
cat << EOF | awk 'BEGIN{IGNORECASE=1} /this/'
2 this test
3 Are awk
This's a
10 There apple
EOF
2 this test
This's a

9、取反

1
2
3
4
5
6
7
8
9
cat << EOF | awk '$2 !~ /th/ {print $2,$4}'
2 this test
3 Are awk
This's a
10 There apple
EOF
Are 
a 
There

10、计算文件大小

1
2
ls -l *.tgz | awk '{sum+=$5} END {printf "%.2fk",sum/1024}'
135.02k

11、打印99乘法表

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'
1x1=1
1x2=2	2x2=4
1x3=3	2x3=6	3x3=9
1x4=4	2x4=8	3x4=12	4x4=16
1x5=5	2x5=10	3x5=15	4x5=20	5x5=25
1x6=6	2x6=12	3x6=18	4x6=24	5x6=30	6x6=36
1x7=7	2x7=14	3x7=21	4x7=28	5x7=35	6x7=42	7x7=49
1x8=8	2x8=16	3x8=24	4x8=32	5x8=40	6x8=48	7x8=56	8x8=64
1x9=9	2x9=18	3x9=27	4x9=36	5x9=45	6x9=54	7x9=63	8x9=72	9x9=81

组合命令使用

1、查出哪个IP地址连接最多

1
netstat -na|grep ESTABLISHED|awk '{print $5}'|awk -F: '{print $1}'|sed '/^$/d'|sort|uniq -c|sort -rn

2、查出那个ip登陆失败次数最多

1
cat /var/log/secure|awk '/Failed/{print $(NF-3)}'|grep [0-9]|sort|uniq -c|sort -rn|awk '{print "访问IP: "$2" => 访问次数 "$1}'

3、查询nginx访问最多的IP排行

1
cat /var/log/nginx/access.log | cut -d ' ' -f 1 | sort | uniq -c | sort -rn | awk '{print $2}' | head -n 10

4、查询nginx访问最多的URL排行

1
cat /var/log/nginx/access.log |awk '{print $1,$7}'|grep ^[0-9]|sort|uniq -c|sort -rn|head -n 10

5、批量查找替换

1
sed -i "s/oldstring/newstring/g" `grep oldstring -rl path`