文本处理工具

文本查看,分析与编辑

文本处理工具

cat

1
-A				# 显示所有系统符号

hexdump

1
2
3
hexdump  -C -n 512 /dev/sda		
# -C 显示ASCII码
# -n 数字 字节长度

more

只能向下翻页,使用空格键或 Enter 键逐步向下滚动。

一次性加载整个文件内容,因此在查看大文件时可能会遇到卡顿。

less:比 more 更好用

持双向滚动。可以使用方向键或 Page Up / Page Down 键向上和向下翻页,允许更方便的文件浏览。

采用逐页加载机制,尤其适合查看大文件,性能更佳,不会一次性加载全部内容。

1
head -n 10 FILE		# 前10行输出

tail

1
tail -n 10 FILE		# 后10行输出

tr

-d :删除所有出现在 SET1 中的字符。

-s :将连续重复出现的字符(由 SET1 和 SET2 指定或其他条件)压缩为单一出现。常和字符替换同时使用,以减少重复字符。

-c :对 SET1 集合进行补集操作,也就是说对不在 SET1 中的字符进行操作。(例如,tr -dc '0-9' 会删除所有不在0到9之间的字符。)

-t :截断 SET1 或 SET2,使得两者长度相同进行处理。该选项在部分系统中可能为默认行为。

常见用法示例

  1. 大小写转换

    将标准输入中的小写字母全部转换为大写字母:

    1
    
    cat file.txt | tr '[:lower:]' '[:upper:]'
    

    或者:

    1
    
    tr 'a-z' 'A-Z' < file.txt
    
  2. 删除特定字符

    删除文本中的所有数字字符:

    1
    
    tr -d '0-9' < file.txt
    

    删除所有换行符(将文本行连接成一行):

    1
    
    tr -d '\n' < file.txt
    
  3. 压缩重复字符

    将连续的空格压缩为单个空格:

    1
    
    tr -s ' ' < file.txt
    

    将连续出现的换行符压缩为一个:

    1
    
    tr -s '\n' < file.txt
    
  4. 删除非数字字符

    保留数字,删除其他所有字符:

    1
    
    tr -cd '0-9' < file.txt
    

    这里 -c 是对字符集取反,-d 是删除该集合字符,因此 -cd '0-9' 即保留数字并删除非数字。

  5. 替换制表符为空格

    有时文件中含有制表符(\t),想将其转换为单个空格:

    1
    
    tr '\t' ' ' < file.txt
    
  6. 多种字符间的映射

    abc 转换为 123

    1
    
    tr 'abc' '123' < file.txt
    

    SET1 长于 SET2 时,多出来的字符会映射为 SET2 的最后一个字符。例如:

    1
    
    tr 'abcd' '12' < file.txt
    

    a 映射到 1b 映射到 2cd 都映射到 2

cut:按列抽取文本

1
2
3
4
5
6
-d			# 指定分隔符
-f			# 要显示列
--output-delimiter="+"		# 输出是用+替代分隔符

head -n 2 <<< $(ifconfig) | tail -n 1| cut -d ' ' -f 10
10.0.0.14

paste:合并文件,行行合并

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
seq 1 10 > 1.txt
printf "%s\n" {a..g} > 2.txt

paste 1.txt 2.txt
1       a
2       b
3       c
4       d
5       e
6       f
7       g
8
9
10
1
2
-d			# 设定分割符
-s			# 一列合成一行
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
paste -d : 1.txt 2.txt
1:a
2:b
3:c
4:d
5:e
6:f
7:g
8:
9:
10:

paste -d : -s 1.txt 2.txt
1:2:3:4:5:6:7:8:9:10
a:b:c:d:e:f:g

xargs

xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。

xargs 一般是和管道一起使用。

 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
-d						# 指定分隔符
-E						# 指定结束符
-l N					# 一次性读取 N 行
-n						# 一次执行用多少参数
-p						# 执行前确认
-r						# 输入为空,不执行
-t						# 显示过程

-i						# 使用{}占位符
-P n					# 并发 n 执行

-0|--null				# 用 assic 中的 0 或 null 作分隔符

echo user{1..5} |xargs -t -n 1 useradd
seq 60 | xargs -i -P3 you-get https://www.bilibili.com/video/BV1KX4y1S7dT?p ={}


ls
'a b' f-1.txt   f-2.txt   f-3.txt

# 'a b',被拆分为
find -type f | xargs ls
ls: cannot access './a': No such file or directory
ls: cannot access 'b': No such file or directory
./f-1.txt  ./f-2.txt  ./f-3.txt

find -type f -print0 |xargs -0 ls
'./a b' ./f-1.txt   ./f-2.txt   ./f-3.txt

ls
1 2 3 4 5

ls * | xargs -n 1 -i {} rename '{}' '{}.txt' {}

ls
1.txt 2.txt 3.txt 4.txt 5.txt

文本分析工具

wc:文本数据统计

1
2
3
4
5
-l		# 只统计行数

wc story.txt
39     237    1901 story.txt
行数	 单词数   字节数

sort:文本排序

1
2
3
4
-u			# 去重
-k 数字		# 指定排序列
-r			# 倒序
-n			# 以数字大小排序

uniq:去重

1
2
3
-c			# 显示重复数
-d			# 仅显示重复的行
-u			# 仅显示不重复的行

diff:比较文件

1
diff -u f1.txt f2.txt  > f.patch

patch:应用差异文件,用于版本更新

1
2
3
4
5
6
7
-b		# 备份

# 到处差异文件
diff -u 100 102 > 100_102.patch

# 将 100 更新为 102
patch -b 100 100_102.patch

cmp:对比二进制文件

grep:正则全局搜索并打印行

 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
-E					# 使用 ERG 正则
-F					# 不正则
-G
-P

-v					# 取反,显示没有匹配到的行
-e pattern0 -e pattern1		# 匹配 0 或 1 
-f FILE				# 从文件中读取匹配规则
-i					# 忽略大小写
-w					# 只匹配完整的单词;"root"(不匹配部分字符串,如 rootuser)

-B N				# 显示匹配到的前 N 行;before
-A N				# 显示匹配到的后 N 行;after
-C N				# 显示匹配到的前后 N 行

-n					# 显示匹配到的行号
-H					# 显示匹配到的文件名
-o					# 仅显示匹配到的内容

-d					# 查找目录
-D					# 查找设备文件

-r					# 递归目录,不处理软链接
-R					# 递归目录,处理软链接

-L|--files-without-match	# 显示没有匹配上的文件名,只显示文件名
-l|--files-with-matches		# 显示匹配上的文件名,只显示文件名

-c|--count 			# 统计匹配到的行数

grep -nir 关键字 /路径
# 大范围文件中,快速检索内容,修改配置
1
2
3
4
5
6
7
8
9
 grep -v nologin /etc/passwd
 
 grep -v "#" /etc/fstab			# 不看注释
 
 grep -n bash /etc/passwd	
 
 grep -C 2 root /etc/passwd		# -A;-B
 
 grep root /etc/passwd | grep bash		# 且匹配
1
2
3
4
5
6
7
8
9
df | grep '^/dev/sd'		
# ^表示行首匹配

df | grep '^/dev/sd' | grep -oE '\< [0-9]{1,3}%' | grep -Eo '[0-9]+'
# -o 只输出匹配到的
# -E 启动正则
# \< 匹配开头
# [0-9]{1,3} 1-3 个 0-9 的数字
# % 有百分比
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@loong ~]# ifconfig | grep -E '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' -o
10.0.0.14
255.255.255.0
10.0.0.255
00:50:56:36    ****
7417145		   ****
35391370       ****
127.0.0.1
255.0.0.0
192.168.122.1
255.255.255.0
192.168.122.255
52:54:00:5     ****
[root@loong ~]# ifconfig | grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' -o
10.0.0.14
255.255.255.0
10.0.0.255
127.0.0.1
255.0.0.0
192.168.122.1
255.255.255.0
192.168.122.255
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
\< 
\>	
# 单词边界符
# \< root 匹配 “root” 出现在单词开头的情况。
# root \> 匹配 "root" 出现在单词结尾的情况。
#  \< root \> 表示“完整匹配单词 root”,避免包含其他字符的词被误匹配。

grep -E "^(.*)\>.* \<\1$" /etc/passwd

# 去看正则位置锚定
# ^
# (.*)
# \1
# $

image-20241030114819359

sed

Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到 最后一行。

一次处理一行的设计模式使得sed性能很高,sed在读取大文件时不会出现卡顿的现象。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
sed option '<匹配条件> [动作]; [动作]' pathOfFile

-n				# 静默模式
-i				# 直接修改文件;-i.bak,以 bak 文件备份原文件
-i.bak
-r				# 扩展正则

# 带时间戳备份
sed -i."$(date +%Y%m%d%H%M%S).bak " 's/old_text/new_text/g' filename.txt

-ni	#危险组合,会清空文件

匹配条件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 数字行数
# 表示所有行
n			 # 表示第 n 行
n, m			# n 到 m
n,+m		# n 到 n+m
$			# 尾行

~			# 表示步进
1~2			# 奇数行
2~2			# 偶数行

# 关键字匹配
'/关键字/'
# /可用@,#,! 替换

/关键字 1/,/关键字 2/		# 匹配到 1 的行,到匹配到 2 的行
n,/关键字 1/

动作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
p				# print
Ip				# 忽略大小写,print
d				# 删除
a[\]text		# append
i[\]text		# insert
c[\]text		# 替换匹配到的整行
s###			# 替换匹配的内容
w file			# 保存至 file
r file			# 读取 file

=				# 显示行号
q				# 结束 sed

# 上面的动作应该在参数为-i 的时候使用,不然的话不会有效果
1
2
3
nihao sed1 sed2 sed3
nihao sed4 sed5 sed6
nihao sed7 sed8 sed9

打印

1
2
3
4
5
6
7
sed '2p' sed.txt -n
nihao sed4 sed5 sed6

sed -n '/^root/p' /etc/passwd
sed -n '/bash$/p' /etc/passwd

sed -n -e '1p' -e '3p' sed.txt

替换

1
2
3
4
5
6
7
8
9
sed -i '行号 s/原内容/替换后内容/列号' file
# 无行号,代表所有行
# 无列号代表第一个

sed -i '行号 s/原内容/替换后内容/g' file
# g,替换所有

sed -i '行号 s#原内容#&新增信息#列号' [文件名]
# &代表原内容
1
2
3
4
5
6
sed -i 's#sed#SED#' sed.txt
sed -i '2s#SED#sed#' sed.txt
sed -i 's#SED#sed#2' sed.txt		# 第二个匹配到的改变

ip a show ens33 | sed -n '3p' | sed -r 's#.*inet (.*) brd.*#\1#'
10.0.0.14/24

追加与插入;\,注意是反斜杠

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
sed -i '行号 a\增加的内容' 文件名			# sed -i '行号 a\增加的内容' 文件名
sed -i '1,3a\增加内容' 文件名			# 范围追加

sed -i '行号 i\增加的内容' 文件名			# 将内容插入到指定的行
sed -i '1,3i\增加内容' 文件名			# 范围插入

# \ 的作用
[root@ubuntu2204 ~]# sed '2a   *******' test.txt 
aaa
bbb
*******
ccc
bbb
[root@ubuntu2204 ~]# sed '2a\   *******' test.txt 
aaa
bbb
  *******
ccc
bbb

删除

1
2
sed -i '行号 d' 文件名
sed -i '1,3d' 文件名

替换整行

1
2
3
4
5
6
7
sed -i '行号 c\内容' 文件名
sed -i '1,3c\内容' 文件名		# 将 1-3 行替换为‘内容’一行;不是每行都替换

[root@rocky9 ~]# head -n 1 /etc/passwd | sed -n 's/root/&user/1p'
rootuser:x:0:0:root:/root:/bin/bash
[root@rocky9 ~]# head -n 1 /etc/passwd | sed -n 's/root/&user/gp'
rootuser:x:0:0:rootuser:/rootuser:/bin/bash

加载保存

1
2
3
4
sed -i '行号 r 文件名 1' 文件名
sed -i '1,3r 文件名 1' 文件名		#每行后都加载

sed -i '行号 w 文件名' 文件名

1
2
3
4
5
ls | grep -Ev 'f-(1|3|5|7)\.txt' | sed -n 's/.*/rm &/p' | bash
[root@ubuntu2204 ~]# ls
f-1.txt  f-3.txt  f-5.txt  f-7.txt

ls | grep -Ev 'f-(1|3|5|7)\.txt' | sed -En 's/(.*)/rm \1/p' | bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
sed -n '/^$/! p' nginx.conf		# 空行不打印
sed -rn '/^(#|$)/! p' nginx.conf	# 过滤掉空行和注释行

# 将非#开头的行加#
sed -rn ‘s/^[^#]/#&/p’ fstab
sed -rn '/^#/! s@^@#@p' fstab
sed -rn 's/^[^#](.*)/#\1/p' fstab

# 添加了 net.ifnames = 0
sed -Ei.bak 's/^(GRUB_CMDLINE_LINUX =.*)"$/\1 net.ifnames = 0 "/' /etc/default/grub
sed -Ei '/^GRUB_CMDLINE_LINUX/s#"$# net.ifnames = 0 "#' /etc/default/grub

^(#|$):匹配以 # 开头的注释行或空行。

  • ^:匹配行的开头。
  • #:表示注释行。
  • $:匹配空行。
  • ( ... ):分组,#$,即匹配注释或空行。
1
2
3
4
5
echo "/etc/sysconfig/network" |sed -r 's#(^/.*/)([^/]+/?)#\1#'
/etc/sysconfig/

echo "/etc/sysconfig/network" |sed -r 's#(^/.*/)([^/]+/?)#\2#' 
network

s#(^/.\*/)([^/]+/?)#\1#:替换命令,用正则表达式匹配并替换。

  • (^/.\*/):匹配以 / 开头的路径,直到最后一个斜杠 / 之前。这里用括号将其分组为 \1,表示路径的父目录。
  • ([^/]+/?):匹配最后一个文件或目录的名称,[^/]+ 表示一个或多个非斜杠字符。
  • \1:替换内容,仅保留第一个分组(即父目录路径部分),去除最后一个文件或目录的名称。

[^/]+

  • [^/]:匹配除斜杠 / 之外的任何字符。方括号内的 ^ 表示“非”或“排除”。
  • +:表示前面的模式(即 [^/])匹配一次或多次。因此,[^/]+ 匹配连续的、非斜杠的字符序列,代表路径中的最后一个文件或目录名称。

/?

  • /:匹配路径中的斜杠。
  • ?:表示前面的 / 是可选的,即可以匹配零次或一次。
  • 所以 /? 表示最后的文件或目录名后面可以带有一个斜杠,也可以没有。
1
2
3
 sed '/^#/d;/^$/d' nginx.conf
 
 sed -r -e " s/listen.*;/listen\t $port;/" -e '/server_name/c\\tserver_name'$(hostname):$port';' nginx.conf

awk

过滤、提取、运算为一体

每一行是一条记录

每一列是一个字段

字段与字段的分隔符默认是一个或多个空格或tab制表符.

工作方式是逐行

image-20241031110536578

1
2
3
awk [参数] 'BEGIN 段 [动作] END 段' [文件名]
-F				# 指定分隔符
-v				# 设置内置变量

内置变量

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
FILENAME		# 当前文件名

FS				# 输入,字段分隔符		Field Separator
OFS				# 输出,字段分隔符		Output Field Separator
RS				# 输入,行分隔符		Record Separator
ORS				# 输出,行分隔符		Output Record Separator

NF				# 每行对应的字段数		Number of Fields
NR				# 行号				Number of Records
FNR				# 各个文件的行号		 File Number of Records

ARGC			# 命令参数个数
ARGV [n]			# 命令参数内容

print

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
$0				# 整行,不分割
$1				# 第一列
$n				# 第 n 列

$NF				# 最后一个列
NR				# 行号

awk -v OFS =':' '{print $0}' awk 
nihao awk1 awk2 awk3
nihao awk4 awk5 awk6
nihao awk7 awk8 awk9

awk -v OFS =':' '{print $1,$ 2}' awk 
nihao: awk1
nihao: awk4
nihao: awk7
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
awk '{print $1"\t"$ 3}' awk.txt

# 动作执行的次数与文件行数一致
awk '{print "hello awk"}' awk
# 指定输出行数
awk 'NR >= 2 && NR <= 4 {print NR, "hello awk"}' awk

awk -F '[:/.]+' '{for (i = 1; i <= 3; i++) printf "%s ", $i; print ""}' domain

awk '{printf "%d--%s--%s\n", NR, $1,$ NR}' awk

awk 'BEGIN{print 2*3}'
6

awk '{print NR, $1"\t"$ 3}{print NR,$2}' awk
1 nihao awk2
1 awk1
2 nihao awk5
2 awk4
3 nihao awk8
3 awk7
4 awk11
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
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
awk -F ":" '
BEGIN {
    printf "--------------------------\n%-17s|%19s|\n---------------------------\n", "用户名", "shell 类型"
}
{
    printf "%-20s|%21s|\n---------------------------\n", $1, $ 7
}
END {
    printf "用户总数: %2d\n", NR
}' /etc/passwd

# %s
# %20s 20 个字符宽度,中文占 2 字符宽度
# %-20s	左对齐,默认右对齐

--------------------------
用户名               |             shell 类型|
---------------------------
root                |            /bin/bash|
---------------------------
bin                 |    /usr/sbin/nologin|
---------------------------
daemon              |    /usr/sbin/nologin|
---------------------------
adm                 |    /usr/sbin/nologin|
---------------------------
lp                  |    /usr/sbin/nologin|
---------------------------
sync                |            /bin/sync|
---------------------------
shutdown            |       /sbin/shutdown|
---------------------------
halt                |           /sbin/halt|
---------------------------
mail                |    /usr/sbin/nologin|
---------------------------
operator            |    /usr/sbin/nologin|
---------------------------
games               |    /usr/sbin/nologin|
---------------------------
ftp                 |    /usr/sbin/nologin|
---------------------------
nobody              |    /usr/sbin/nologin|
---------------------------
systemd-coredump    |        /sbin/nologin|
---------------------------
saslauth            |        /sbin/nologin|
---------------------------
libstoragemgmt      |        /sbin/nologin|
---------------------------
rpc                 |        /sbin/nologin|
---------------------------
tss                 |        /sbin/nologin|
---------------------------
dhcpd               |        /sbin/nologin|
---------------------------
dnsmasq             |    /usr/sbin/nologin|
---------------------------
sshd                |        /sbin/nologin|
---------------------------
dbus                |        /sbin/nologin|
---------------------------
polkitd             |        /sbin/nologin|
---------------------------
unbound             |        /sbin/nologin|
---------------------------
qemu                |        /sbin/nologin|
---------------------------
rpcuser             |        /sbin/nologin|
---------------------------
cockpit-ws          |        /sbin/nologin|
---------------------------
cockpit-wsinstance  |        /sbin/nologin|
---------------------------
chrony              |        /sbin/nologin|
---------------------------
tcpdump             |        /sbin/nologin|
---------------------------
nginx               |        /sbin/nologin|
---------------------------
ntp                 |        /sbin/nologin|
---------------------------
noob                |            /bin/bash|
---------------------------
loong               |            /bin/bash|
---------------------------
用户总数: 34
1
2
3
4
5
6
7
[root@loong vim]# awk 'BEGIN{FIELDWIDTHS = "5 2 8"}NR == 1{print $1,$ 2,$3}' /etc/passwd 
root: x: 0:0:Supe
[root@loong vim]# cat /etc/passwd 
root:x:0:0:Super User:/root:/bin/bash

# FIELDWIDTHS = "5 2 8"
# 5 个字符为 $1;2=$ 2;8 =$3

自定义变量

1
2
3
4
5
awk -v var1 = abc 'BEGIN{print var1}'
awk -v var1 = abc -v VAR1 = 123 'BEGIN{print var1, VAR1}'

awk 'BEGIN{name = "shuji"; print name}'
awk -v var1 = abc 'BEGIN{print var1; var1 = "def"; print var1}{print var1}' /etc/os-release

匹配运算

1
2
3
4
5
~
!~

awk -F ':' '$1 ~ "^[a-d].*" {print $ 0}' /etc/passwd
awk -F ':' '$1 !~ "^[a-d].*" {print $ 0}' /etc/passwd

x?x:x

ture前

false后

1
awk -F: '{$3>=1000?utype="Common":utype="Sys"; printf "%-20s:%12s\n",$ 1, utype}' /etc/passwd

条件判断

if-else

1
awk -F: '{if($3<=100){print "<=100",$ 3}else if ($3<=1000){print "<=1000",$ 3} else{print "> 1000",$3}}' /etc/passwd

swich-case

1
awk -F: '{switch($3){case 0:print "root",$ 3; break; case /^[1-9][0-9]{0,2}$|1000/:print "sys user",$ 3; break; default: print "common user",$3; break;}}' /etc/passwd

image-20241031173129888

while

1
2
3
awk -v i = 1 -v sum = 0 'BEGIN{while(i <= 100){sum+= i; i++}; print sum}'

awk 'BEGIN{ total = 0; i = 1; do{total+= i; i++;}while(i <= 100); print total}'

for

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
echo 'dsFUs34tg*fs5a8ar%$#@' | awk -F "" '
{
    str = ""  # 初始化 str 为空字符串
    for (i = 1; i <= NF; i++) {
        if ($i ~ /[0-9]/) {  # 如果 $ i 是数字字符
            str = (str $i)   # 拼接数字字符到 str
        }
    }
    print str  # 输出拼接后的数字字符串
}'

continue 和 break

next

下一行处理(awk自身循环)

数组

判断索引存不存在

1
2
awk 'BEGIN{array ["i"] = "x"; array ["j"] = "y" ; print "i" in array, "y" in array }'
0 1

image-20241031183119424

遍历数组

1
2
3
4
5
6
7
8
awk 'BEGIN {
a ["x"] = "welcome"
a ["y"] = "to"
a ["z"] = "Magedu"
for (i in a) {
	print i, a [i]
}
}'
1
2
3
4
5
6
7
8
9
awk '{
    ip[$1]++
} END {
    for (i in ip) {
        if (ip [i] >= 1000) {
            system("iptables -A INPUT -s \"" i "\" -j REJECT")
        }
    }
}' nginx.access.log-20200428

image-20241031183808835

image-20241031201121049

内置函数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
int()		# 转为 int
sqrt()		# 平方根

srand()		# 设置 rand 种子
rand()		# 随机数

# 字符串类
length()
strtonum()	# 0 开头,8 进制;0x 开头,16 进制
tolower()
toupper()
index(str, substr)		# 在 str 中查找 substr,有,返回索引;无,返回 0
split(str, arr, 分隔符)
match()
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
awk 'BEGIN{a = sprintf("%s-%d-%s", "abc",23, "ert"); print a}'

awk 'BEGIN{v = "nsfadsafdsaf"; print length(v)}'

awk 'BEGIN{str = "nsfad"; print index(str, "ns")}'
1

awk 'BEGIN{v = "abcdefgh"; print substr(v,3,3)}'
cde

awk 'BEGIN{split("abc-def-gho-pq", arr, "-", seps); print length(arr), arr [3], seps [1]}'
4 gho -

awk 'BEGIN{str = "safdsajfkdsajlfjdsl"; print match(str," j.*s ")}'
7

awk 'BEGIN{str = "safdsajfkdsajlfjdsl"; match(str," j.*s ", arry); print arry [0]}'
jfkdsajlfjds
1
2
3
4
5
6
7
8
systime()
awk 'BEGIN{print strftime()}'

# 系统命令
system(cmd)
awk 'BEGIN{system("hostname")}'

isarray()
1
2
3
4
[root@loong vim]# awk 'BEGIN{v =("aa" "bb" 11); print isarray(v)}'
0
[root@loong vim]# awk 'BEGIN{v [1] =("aa" "bb" 11); print isarray(v)}'
1

自定义函数

1
2
3
4
5
function name ( parameter, parameter, ... ) {
   statements
   return expression
}
awk 'function test(){print "hello test func"}BEGIN{test()}'