当前位置: 首页 > news >正文

行业门户网站建设方案书帝国cms怎么做网站地图

行业门户网站建设方案书,帝国cms怎么做网站地图,芜湖弋江区最新消息,关键词seo优化公司目录 1文本编辑工具之神VIM1.1 vi和vim简介1.2使用vim1.2.1 vim 命令格式1.2.2三种主要模式和转换 1.3扩展命令模式1.3.1扩展命令模式基本命令1.3.2 地址定界1.3.3查找并替换1.3.4定制vim的工作特性1.3.4.1行号1.3.4.2忽略字符的大小写1.3.4.3白动缩进1.3.4.4复制粘贴保留格式1… 目录 1文本编辑工具之神VIM1.1 vi和vim简介1.2使用vim1.2.1 vim 命令格式1.2.2三种主要模式和转换 1.3扩展命令模式1.3.1扩展命令模式基本命令1.3.2 地址定界1.3.3查找并替换1.3.4定制vim的工作特性1.3.4.1行号1.3.4.2忽略字符的大小写1.3.4.3白动缩进1.3.4.4复制粘贴保留格式1.3.4.5显示Tab和换行符I和$显示1.3.4.6高亮搜索1.3.4.7语法高亮1.3.4.8文件格式1.3.4.9设置文本宽度1.3.4.10设置光标所在行的标识线1.3.4.11加密1.3.4.12 了解更多 1.4 命令模式1.4.1 退出VIM1.4.2 光标跳转1.4.3 字符编辑1.4.4 替换命令(replace)1.4.5 删除(剪切)命令(delete )1.4.6 复制命令(yank)1.4.7 粘贴命令(paste)1.4.8 改变命令(change)1.4.9 查找1.4.10 撤消更改1.4.10 高级用法 1.5 可视化模式1.6 多文件模式1.7 多窗口模式1.7.1 多文件分割1.7.2 单文件窗口分割 1.8 vim的寄存器1.9 标记和宏(macro)1.10 编辑二进制文件1.11 帮助 2 文本常见处理工具2.1 文件内容查看命令2.1.1 查看文本文件内容2.1.2 查看非文本文件内容2.1.2.1 hexdump2.1.2.2 od2.1.2.3 xxd 2.2 分页查看文件内容2.2.1 more2.2.2 less 2.3 显示文本前或后行内容2.3.1 head2.3.2 tail 2.4 按列抽取文本2.5 合并多个文件2.6 分析文本的工具2.6.1 收集文本统计数据2.6.2 文本排序sort2.6.3 去重uniq2.6.4 比较文件2.6.4.1 diff2.6.4.2 patch2.6.4.3 cmp 3 正则表达式3.1 基本正则表达式元字符3.1.1 字符匹配3.1.2 匹配次数3.1.3 位置锚定3.1.4 分组其它 3.2 扩展正则表达式3.2.1 字符匹配元字符3.2.2 次数匹配3.2.3 位置锚定3.2.4 分组其它 4 文本处理三剑客4.1 文本处理三剑客之 grep4.2 文本处理三剑客之 sed4.2.1 sed 工作原理4.2.2 sed 基本用法4.2.3 sed 高级用法 4.3 文本处理三剑客之 awk4.3.1 awk 工作原理和基本用法说明4.3.2 print 和 printf4.3.2.1 动作print4.3.2.2 动作 prinitf 4.3.3 awk变量4.3.3.1 FS4.3.3.2 OFS4.3.3.3 RS4.3.3.4 ORS4.3.3.5 NF4.3.3.6 NR4.3.3.7 FNR4.3.3.8 FILENAME4.3.3.9 ARGC4.3.3.10 ARGV 4.3.4 操作符**4.3.4.1 算术操作符****4.3.4.2 赋值操作符****4.3.4.3 比较操作符****4.3.4.4 模式匹配符****4.3.4.5 逻辑操作符:****4.3.4.6 条件表达式(三目表达式)** 4.3.5 模式PATTERN4.3.6 条件判断 if-else4.3.7 switch语句4.3.8 循环while4.3.9 循环 do-while4.3.10 循环for4.3.11 continue和break4.3.12 next4.3.13 数组4.3.14 awk函数4.3.14.1 常见内置函数**4.3.14.1.1数值处理****4.3.14.1.2字符串处理****4.3.14.1.2.1 length/sub****4.3.14.1.2.2 gsub****4.3.14.1.2.3 split****4.3.14.1.2.4 system** 4.3.14.2 自定义函数 4.3.15 awk脚本**4.3.14.1.2.3 split****4.3.14.1.2.4 system** 4.3.14.2 自定义函数 4.3.15 awk脚本 1文本编辑工具之神VIM 1.1 vi和vim简介 在Linux中我们经常编辑修改文本文件, 即由ASCl, Unicode 或其它编码的纯文字的文件。之前介绍过nano, 实际 工作中我们会使用更为专业, 功能强大的工具 文本编辑种类 全屏编辑器 nano(字符工具), gedit(图形化工具), vi, vim 行编辑器 sed vi Visual editor, 文本编辑器, 是Linux 必备工具之一, 功能强大, 学习曲线较陡峭, 学习难度大 vimVisual editor iMproved, 和vi 使用方法一致, 但功能更为强大, 不是必备软件 官网 www.vim.org 其他相关编辑器 gvim 一个Vim编辑器的图形版本 1.2使用vim 1.2.1 vim 命令格式 vim[OPTION]...FILE...打开文件后, 让光标处于第 # 行的行首, 默认行尾 /PATTERN 让光标处于第一个被PATTERN匹配到的行行首-b file 二进制方式打开文件-d file1 file2... 比较多个文件,相当于 vimdiff-m file 只读打开文件-e file 直接进入ex模式,相当于执行ex file说明 如果该文件存在,文件被打开并显示内容如果该文件不存在,当编辑后第一次存盘时创建它1.2.2三种主要模式和转换 vim 是一个模式编辑器,击键行为是依赖于vim的的“模式” 三种常见模式 命令或普通(Normal)模式 默认模式,可以实现移动光标,剪切/粘贴文本插入(Insert)或编辑模式 用于修改文本扩展命令(extended CMD)或命令(末)行模式 保存, 退出等 命令模式-- 插入模式 i insert, 在光标所在处输入 I 在当前光标所在行的行首输入 a append, 在光标所在处后面输入 A 在当前光标所在行的行尾输入 o 在当前光标所在行的下方打开一个新行 O 在当前光标所在行的上方打开一个新行插入模式----ESC---- 命令模式 命令模式---- ---- 扩展命令模式 扩展命令模式----ESC, enter---- 命令模式 1.3扩展命令模式 按 进入Ex模式, 创建一个命令提示符 处于底部的屏幕左侧 1.3.1扩展命令模式基本命令 w 写存磁盘文件 wq 写入并退出 x 写入并退出 X 加密。取消密码不输入任何字符直接保存 q 退出 q!不存盘退出即使更改都将丢失 r filename 读文件内容到当前文件中 如 r filename 回车就可以将文件内容直接加入进去光标后 w filename 将当前文件内容写入另一个文件 !cmd 不更换窗口或关闭vim就可执行命令不可是别名 r!cmd 读入命令的输出到光标后1.3.2 地址定界 start_pos, end_pos cmd具体第 # 行例如2表示第2行, # 从左侧 # 表示起始行到右侧 # 表示结尾行, # 从左侧 # 表示的起始行加上右侧 # 表示的行数范例 2, 3 表示2到5行.当前行 $ 最后一行 ., $ - 1 当前行到倒数第二行% 全文相当于1, $地址定界后跟一个编辑命令cmd d 删除 y 复制 w file 将范围内的行另存至指定文件中 r file 在指定位置插入指定文件中的所有内容例 2, 4 d 即删除2 - 4行 2, 3y 即复制2 3行中间有空行另 复制后按p加到光标后大写P加到光标前/pattern/从当前行向下查找直到匹配pattern的第一行, 即 正则表达式 /pat1/, /pat2/从第一次被pat1模式匹配到的行开始一直到第一次被pat2匹配到的行结束, /pat/从指定行开始一直找到第一个匹配patttern的行结束/pat/, $ 向下找到第一个匹配patttern的行到整个文件的结尾的所有行1.3.3查找并替换 格式 s / 要查找的内容 / 替换为的内容 / 修饰符要查找的内容可使用正则表达式模式 替换为的内容不能使用模式但可以使用 \ 1, \ 2, …等后向引用符号还可以使用 引用前面查找时查找到的整个内容 修饰符 i 忽略大小写g 全局替换默认情况下每一行只替换第一次出现gc 全局替换每次替换前询问 如 1, 4s / root / babe / g 将1 - 4行的root全部修改为babe不加g只修改一行中的第一个% s / root / babe / g 修改所有的root为babe说明 查找替换中的分隔符 / 可替换为其它字符, 如 # , , 这对于修改目录或文件时有用, 避免出现很多 / 1.3.4定制vim的工作特性 配置文件 永久有效 全局 /etc/vimrc 个人 ~ / .vimrc 扩展命令模式 当前vim进程有效 1.3.4.1行号 显示 set number简写 set nu 取消显示 set nonumber, 简写 set nonu1.3.4.2忽略字符的大小写 启用 set ignorecase简写 set ic 不忽略 set noic1.3.4.3白动缩进 启用 set autoindent简写 set ai 禁用 set noai1.3.4.4复制粘贴保留格式 启用 set paste 禁用 set nopaste1.3.4.5显示Tab和换行符I和$显示 启用 set list 禁用 set nolist1.3.4.6高亮搜索 启用 set hlsearch 禁用 set nohlsearch1.3.4.7语法高亮 启用 syntax on 禁用 syntax off1.3.4.8文件格式 启用windows格式 set fileformat dos 启用unix格式 set fileformat unix 简写 set ff dosunix1.3.4.9设置文本宽度 set textwidth 65(vim only) set wrapmargin 151.3.4.10设置光标所在行的标识线 启用 set cursorline简写 set cul 禁用 set nocursorline1.3.4.11加密 启用 set key password 禁用 set key 1.3.4.12 了解更多 set 帮助help option - listset a1.4 命令模式 命令模式功能强大又称为Normal模式只是按键时屏幕看不到输入所以需要大量的记忆才能更好的使用。 1.4.1 退出VIM Zz 保存退出 ZQ 不保存退出1.4.2 光标跳转 字符间跳转 h 左 L 右 j 下 k 上CMD 跳转由 # 指定的个数的字符单词间跳转 w 下一个单词的词首 e 当前或下一单词的词尾 b 当前或前一个单词的词首CMD 由 # 指定一次跳转的单词数 当前页跳转 H 页首 M 页中间行 L 页底 zt 将光标所在当前行移到屏幕顶端 zz 将光标所在当前行移到屏幕中间 zb 将光标所在当前行移到屏幕底端行首行尾跳转 ^ 跳转至行首的第一个非空白字符 0 跳转至行首 $ 跳转至行尾行间移动 跳转至由第 # 行。或者扩展命令模式下G 最后一行 1G, gg 第一行句间移动 )下一句(上一句 用.隔开的句子 段落间移动 } 下一段 } 上一段 用一整行空行隔开的句子命令模式翻屏操作 Ctrl f 向文件尾部翻一屏 Ctrl b 向文件首部翻一屏 Ctrl d 向文件尾部翻半屏 Ctrl u 向文件首部翻半屏1.4.3 字符编辑 x 剪切光标处的字符x 剪切光标处起始的 # 个字符xp 交换光标所在处的字符及其后面字符的位置即剪切后粘贴 ~转换大小写 J 删除当前行后的换行符1.4.4 替换命令(replace) r 替换光标所在处的一个字符即按下一个字符 R 切换成REPLACE模式在最下面显示REPLACE, 按ESC回到命令模式1.4.5 删除(剪切)命令(delete ) d 剪切命令可结合光标跳转字符实现范围剪切 d$ 剪切到行尾 d ^ 剪切除到非空行首 d0 剪切到行首 dw 剪切至 下一个单词的词首 de 剪切至 当前或下一个单词的词尾 db 剪切至 当前或前一个单词的词首CMDdd 剪切光标所在的行dd 多行剪切D 从当前光标位置一直剪切到行尾等同于d$1.4.6 复制命令(yank) y 复制行为相似于d命令 y$ 复制到行尾 y ^ 复制除到非空行首 y0 复制到行首 yw 复制至 下一个单词的词首 ye 复制至 当前或下一个单词的词尾 yb 复制至 当前或前一个单词的词首 yy 复制行yy 复制多行Y 复制整行1.4.7 粘贴命令(paste) p 缓冲区存的如果为整行则粘贴当前光标所在行的下方;否则粘贴至当前光标所在处的后面 P 缓冲区存的如果为整行则粘贴当前光标所在行的上方;否则粘贴至当前光标所在处的前面 1.4.8 改变命令(change) c 删除后切换成插入模式 c$ c ^ c0 cw ce cb cyCMD cc 删除当前行并进入插入模式输入新内容相当于S cc C 删除当前光标到行尾并切换成插入模式, 相当于c$1.4.9 查找 /PATTERN or /string从当前光标所在处向文件尾部查找? PATTERN or / string 从当前光标所在处向文件首部查找 n 与命令同方向找下一个 N 与命令反方向找下一个1.4.10 撤消更改 u 撤销最近的更改, 相当于win里ctrl zu 撤销之前多次更改U 撤消光标落在这行后所有此行的更改 Ctrl - r 重做最后的“撤消”更改, 相当于win里ctrl y .重复前一个操作.重复前一个操作 # 次1.4.10 高级用法 start position CMD end position 常见CMD y复制、d 删除、gU 变大写、gu 变小写 范例 0y$ 从行首拷贝到行尾di 光标在 之间则删除 之间的内容 (可以使用其他括号) yi( 光标在()之间则复制()之间的内容 vi[ 光标在[]之间则选中[]之间的内容 vi{ 光标在{}之间则选中{}之间的内容 dtx 删除字符直到遇见光标之后的第一个 x 字符 ytx 复制字符直到遇见光标之后的第一个 x 字符1.5 可视化模式 在末行有–VISUAL–指示表示在可视化模式 允许选择的文本块 v 面向字符-- VISUAL –V 面向整行-- VISUAL LINE –ctrl v 面向块–VISUAL BLOCK– 可视化键可用于与移动键结合使用 w ) } 箭头等 突出显示的文字可被删除复制变更过滤搜索替换等 范例在文件行首插入# 输入ctrlv 进入可视化模式 输入 G 跳到最后1行选中每一行的第一个字符 输入 I 切换至插入模式 输入 # 在行首插入# 按 ESC 键 使全部行首都插入#1.6 多文件模式 vim FILE1 FILE2 FILE3 ... next 下一个 prev 前一个 first 第一个 last 最后一个 wall 保存所有 qall 不保存退出所有 wqall 保存退出所有1.7 多窗口模式 1.7.1 多文件分割 vim -o|-O FILE1 FILE2 ... -o 水平或上下分 -o 垂直或左右分割 (vim only) 在窗口间切换 Ctrlw,Arrow1.7.2 单文件窗口分割 Ctrlw,s split, 水平分割上下分屏 Ctrlw,v vertical,垂直分割左右分屏 ctrlw,q 取消相邻窗口 ctrlw,o 取消全部窗口 wqall 保存退出1.8 vim的寄存器 有26个命名寄存器和1个无命名寄存器常存放不同的剪贴版内容可以在同一个主机的不同会话(终端窗口)间共享 寄存器名称ab,…,z, 格式 寄存器 放在数字和命令之间范例 3 tyy 表示复制3行到t寄存器中未行显示3 lines yanked into ttp 表示将t寄存器内容粘贴若未指定将使用无命名寄存器 有10个数字寄存器用01…9表示0存放最近复制内容1存放最近删除内容。当新的文本变更和删除时1转存到22转存到3以此类推。数字寄存器不能在不同会话间共享 1.9 标记和宏(macro) ma 将当前位置标记为a26个字母均可做标记 mb 、mc 等等 a 跳转到a标记的位置实用的文档内标记方法文档中跳跃编辑时很有用 qa 录制宏aa为宏的名称未行提示 recording a q 停止录制宏 a 执行宏 a重新执行上次执行的宏1.10 编辑二进制文件 1以二进制方式打开文件 vim -b binaryfile 2扩展命令模式下利用xxd命令转换为可读的十六进制 %!xxd 3切换至插入模式下编辑二进制文件 4切换至扩展命令模式下利用xxd命令转换回二进制 %!xxd -r 5保存退出1.11 帮助 help help topic Use q to exit help 或命令vimtutor直接打开vim的帮助2 文本常见处理工具 2.1 文件内容查看命令 2.1.1 查看文本文件内容 cat 可以查看文本内容 格式 cat [OPTION]...[FILE]...常见选项 -E 显示待结束符$ -A 显示所有控制符 -n 对显示出的每一行进行编号包括空行 -b 非空行才加编号 -s 压缩连续的空行成一行 tac [filename] 逆向显示文本内容 ,和下面均支持标准输入 nl [filename] 显示行号,相当于cat -b rev [filename] 将同一行的内容逆向显示2.1.2 查看非文本文件内容 2.1.2.1 hexdump 例 #echo {a..z} | tr -d |hexdump -C 00000000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 |abcdefghijklmnop| 00000010 71 72 73 74 75 76 77 78 79 7a 0a |qrstuvwxyz.| 0000001b2.1.2.2 od od dump files in octal and other formats例 #echo {a..z} | tr -d |od -t x 0000000 64636261 68676665 6c6b6a69 706f6e6d 0000020 74737271 78777675 000a7a79 0000033#echo {a..z} | tr -d |od -t x1 0000000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 0000020 71 72 73 74 75 76 77 78 79 7a 0a 0000033#echo {a..z} | tr -d |od -t x1z 0000000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 abcdefghijklmnop 0000020 71 72 73 74 75 76 77 78 79 7a 0a qrstuvwxyz. 00000332.1.2.3 xxd 例 #echo {a..z} | tr -d |xxd 00000000: 6162 6364 6566 6768 696a 6b6c 6d6e 6f70 abcdefghijklmnop 00000010: 7172 7374 7576 7778 797a 0a qrstuvwxyz.2.2 分页查看文件内容 2.2.1 more 可以实现分页查看文件可以配合管道实现输出信息的分页 格式 more [OPTIONS...] FILE..选项 -d 显示翻页及退出提示 less 也可以实现分页查看文件或STDIN输出 查看时有用的命令包括 /文本搜索文本 n/N 跳到下一个 或 上一个匹配注意more只能向下翻且到100%即阅读完时将自动退出文件的查看 2.2.2 less less命令是man命令使用的分页器 less2.3 显示文本前或后行内容 2.3.1 head head 可以显示文件或标准输入的前面行默认前10行 格式 head [OPTION]...[FILE]..选项 -C# 指定获取前#字节 -n# 指定获取前#行 -# 同上例 #head -n 5 /etc/passwd 查看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#ls /etc/ -lS |head -5 将etc下的文件降序排序后查看前5个最大的文件 total 1412 -rw-r--r--. 1 root root 692252 May 15 2020 services -rw-r--r--. 1 root root 60352 May 11 2017 mime.types -rw-r--r--. 1 root root 44379 Jul 10 20:05 ld.so.cache -rw-r--r--. 1 root dnsmasq 26843 Aug 10 2021 dnsmasq.conf2.3.2 tail tail 和head 相反查看文件或标准输入的倒数行 格式 tai1 [OPTION]... [FILE]...-C# 指定获取后#字节 -n# 指定获取后#行 -# 同上 -f 跟踪显示文件fd新追加的内容,常用日志监控相当于 --foowdescriptor,当文件删除再新建同名文件,将无法继续跟踪文件 -F 跟踪文件名相当于--followname --retry,当文件删除再新建同名文件,将可以继续跟踪文件 tailf 类似tail -f当文件不增长时并不访问文件例 #tail -fn0或-0f /var/log/messages 从0开始跟踪messages文件的日志生成即最新生成的日志#ifconfig ens160 |head -2|tail -1 准确找到inconfig的ip地址的那一行的数据显示 inet 10.0.0.201 netmask 255.255.255.0 broadcast 10.0.0.255注意一次性命令不可跟踪如dmesg执行一次就退出。 ping也不可以无法显示出来** 2.4 按列抽取文本 cut 命令可以提取文本文件或STDIN数据的指定列 格式 cut [OPTION]...[FILE]...选项 -d DELIMITER 指明分隔符默认tab -f FILEDS#: 第#个字段,例如:3#,#l,#]: 离散的多个字段例如:1,3,6#-#: 连续的多个字段,例如1-6混合使用~1-3,7 -c 按字符切割 --output-delimiterSTRING指定输出分隔符例 #df|tr -s |cut -d -f5|tr -d % 快速取出df命令下的第五列磁盘空间利用率数据最后将%删除 Use 0 0 1 0 20 1 21 1 0#df|tr -s %|cut -d% -f5 快速取出df命令下的第五列磁盘空间利用率数据且不带% Use 0 0 1 0 20 1 21 1 02.5 合并多个文件 paste 合并多个文件同行号的列到一行 格式 paste [OPTION]..[FILE].-d分隔符 指定分隔符默认用TAB -s 所有行合成一行显示即多行一列转换成一行多列2.6 分析文本的工具 文本数据统计 wc 整理文本 sort 比较文件 diff和patch 2.6.1 收集文本统计数据 wc 命令可用于统计文件的行总数、单词总数、字节总数和字符总数可以对文件或STDIN中的数据统计 常用选项 -l 只计数行数 -W 只计数单词总数 -c 只计数字节总数 -m 只计数字符总数 -L 显示文件中最长行的长度例 ls /etc/ | wc -l 查看etc下有多少个文件 279#df |tail -n $(echo df | wc -l -l|bc) 不显示df的第一行注释行显示下面的9行 Filesystem 1K-blocks Used Available Use% Mounted on devtmpfs 1969208 0 1969208 0% /dev tmpfs 1997600 0 1997600 0% /dev/shm tmpfs 1997600 9940 1987660 1% /run tmpfs 1997600 0 1997600 0% /sys/fs/cgroup /dev/sda2 104806400 20871932 83934468 20% / /dev/sda3 52403200 398476 52004724 1% /data /dev/sda1 999320 193956 736552 21% /boot tmpfs 399520 24 399496 1% /run/user/0 /dev/sr0 10540998 10540998 0 100% /run/media/root/CentOS-8-5-2111-x86_64-dvd2.6.2 文本排序sort 把整理过的文本显示在STDOUT不改变原始文件 格式 sort [options] file(s)常用选项 -r 执行反方向 (由上至下) 整理一般配合-n使用 -R 随机排序 -n 执行按数字大小整理 -f 选项忽略 (fold) 字符串中的字符大小写 -u 选项 (独特unique) 删除输出中的重复行 -t c 选项使用c做为字段界定符 -k# 选项按照使用c字符分隔的 # 列来整理能够使用多次例 seq 10 | sort -R 将生成的1——10的数字随机排序 9 5 7 4 8 1 6 3 10 22.6.3 去重uniq uniq命令从输入中删除前后相接的重复的行 格式 uniq [OPTION]...[FILE]..常见选项 -c 显示每行重复出现的次数 -d 仅显示重复过的行 -u 仅显示不曾重复的行 uniq常和sort 命令一起配合使用#cut -d -fl access_log |sort |uniq -c|sort -nr |head -3 查看日志里访问次数最多的前三个ip地址有排序、统计和筛选#ss -nt|tai1 -n2|tr -s : |cut -d: -f6|sort|uniq -c|sort -nr |head -n2 查看当前主机连接次数最多的前2名去除文件开头注释#cat f2.txt f3.txt |sort|uniq -d 过滤出2个文件的相同行文件本身没有重复 1 b c2.6.4 比较文件 2.6.4.1 diff diff命令可以比较2个文本文件的区别 2.6.4.2 patch patch 复制在其它文件中进行的改变 (要谨慎使用) 适用 -b 选项来自动备份改变了的文件 2.6.4.3 cmp cmp比较二进制文件的不同 例 #ll /bin/ls /bin/dir -rwxr-xr-x. 1 root root 143224 Jul 14 2021 /bin/dir -rwxr-xr-x. 1 root root 143224 Jul 14 2021 /bin/ls #cmp /bin/ls /bin/dir /bin/ls /bin/dir differ byte 793, line 1 #hexdump -s 790 -Cn 3 /bin/ls 00000316 55 00 bc |U..| 00000319 #hexdump -s 790 -Cn 3 /bin/dir 00000316 55 00 4a |U.J| 000003193 正则表达式 REGEXP Regular Expressions由一类特殊字符及文本字符所编写的模式其中有些字符(元字符)不表示字符字面意义而表示控制或通配的功能类似于增强版的通配符功能但与通配符不同通配符功能是用来处理文件名而正则表达式是处理文本内容中字符 正则表达式被很多程序和开发语言所广泛支持 vim,less,grep,sed,awk,nginx,mysgl等 正则表达式分两类 ​ 基本正则表达式 BRE​ 扩展正则表达式 ERE 正则表达式引擎 采用不同算法检查处理正则表达式的软件模块如 PCRE (Perl Compatible Regular Expressions) 正则表达式的元字符分类 字符匹配、匹配次数、位置锚定、分组 帮助 man 7 regex 3.1 基本正则表达式元字符 3.1.1 字符匹配 . 匹配任意单个字符并非字节所以可以是一个汉字 [] 匹配指定范围内的任意单个字符示例 [joyce] [0-9] [a-z] [a-zA-Z] [^] 匹配指定范围外的任意单个字符,示例 [^joyce] [:alnum:] 字母和数字 [:alpha:] 代表任何英文大小写字符亦即 A-Za-z [:lower:] 小写字母,示例:[[:1ower:]],相当于[a-z] [:upper:] 大写字母 [:blank:] 空白字符 (空格和制表符) [:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广) [:cntr1:] 不可打印的控制字符 (退格、删除、警铃...) [:digit:] 十进制数字 [:xdigit:] 十六进制数字 [:graph:] 可打印的非空白字符 [:print:] 可打印字符 [:punct:] 标点符号例 #grep r..t /etc/passwd 显示passwd里符合r..t的行中间可以是任意字符 root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin clevis:x:976:976:Clevis Decryption Framework unprivileged user:/var/cache/clevis:/sbin/nologin#ls /etc/|grep rc[.0-6] 显示etc下所有rc后跟任意字符或0-6数字的文件 rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rc.d rc.local#ls /etc/|grep rc[.0-6]\. 显示etc下所有rc后跟任意字符或0-6数字且下一个字符是.的文件 rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d3.1.2 匹配次数 用在要指定次数的字符后面用于指定前面的字符要出现的次数 * 匹配前面的一个字符任意次包括0次贪婪模式 尽可能长的匹配 .* 任意长度的任意字符相当于任意字符串 \? 匹配其前面的字符0或1次即可有可无 \ 匹配其前面的字符至少1次即肯定有 \{n\} 匹配前面的字符n次 \{m,n\} 匹配前面的字符至少m次至多n次 \{,n\} 匹配前面的字符至多n次 \{n,\} 匹配前面的字符至少n次例 #echo helo|grep hel*o 输出任意个l的字符串 helo]#echo helllllllllllllo|grep hel*o 输出人一个l的字符串 helllllllllllllo#echo hello|grep hel\o 输出至少包含1个l的字符串 hello3.1.3 位置锚定 位置锚定可以用于定位出现的位置 ^ 行首错定用于模式的最左侧 $ 行尾错定用于模式的最右侧 ^PATTERN$ 用于模式匹配整行 ^$ 空行 ^[[:space:]]*$ 空白行 \ 或 \b 词首错定用于单词模式的左侧 \ 或 \b 词尾错定用于单词模式的右侧 \PATTERN\ 匹配整个单词例 #grep ^.[joyce] /etc/passwd 显示passwd中以任意字符开头且第二个字符是joyce任意一个字符的行 root:x:0:0:root:/root:/bin/bash sync:x:5:0:sync:/sbin:/bin/sync nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin#grep -v ^$ /etc/profile|grep -v ^# 过滤profile中以#开头的注释行和空行#df |grep ^/dev/sd|grep -o *[1-9]\?[0-9]% 显示df中dev/sda磁盘空间利用率那一列的数据(区间0-99)20%1%21%3.1.4 分组其它 分组 0 将多个字符捆绑在一起当作一个整体处理如 (root) 后向引用分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中这些变量的命名方式为\1,2,3\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符 例 #echo abcabcabc |grep abc\{3\} 直接这样写匹配的是abccc #echo abcabcabc |grep \(abc\)\{3\} 将abc加小括号分组成一个整体就可以匹配abc abcabcabc注意后向引用中引用前面的分组括号中的模式所匹配字符而非模式本身 或者\ 例在vim编辑器的命令模式下 :%s$^#\(.*\)$\1$ 将每行以#开头的其后的内容全部分组并重新赋值给这一行即删除所有行首的#号 :%s$^#$$ 将每行以#开头的#全部替换为空即删除所有行首的#号 :%s$^UUID$#UUID$ 或 :%s$^\(UUID)\$#\1$ 将所有UUID开头的行前加上#号或者: \|例 #grep -v ^#\|^$ /etc/profile 以 或者 的方式过滤profile中以#开头的注释行和空行 #grep -v ^\(#\|$\) /etc/profile 以 分组和或者 的方式 过滤profile中以#开头的注释行和空行 #grep -v ^[^#] /etc/profile 先排除所有以#开头的行再输出至少包含1个字符即非空行[]3.2 扩展正则表达式 基本上是删除\前面加-E选项或者使用egrep即可 3.2.1 字符匹配元字符 . 匹配任意单个字符并非字节所以可以是一个汉字 [] 匹配指定范围内的任意单个字符示例 [joyce] [0-9] [a-z] [a-zA-Z] [^] 匹配指定范围外的任意单个字符,示例 [^joyce] [:alnum:] 字母和数字 [:alpha:] 代表任何英文大小写字符亦即 A-Za-z [:lower:] 小写字母,示例:[[:1ower:]],相当于[a-z] [:upper:] 大写字母 [:blank:] 空白字符 (空格和制表符) [:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广) [:cntr1:] 不可打印的控制字符 (退格、删除、警铃...) [:digit:] 十进制数字 [:xdigit:] 十六进制数字 [:graph:] 可打印的非空白字符 [:print:] 可打印字符 [:punct:] 标点符号3.2.2 次数匹配 * 匹配前面的一个字符任意次包括0次贪婪模式 尽可能长的匹配? 匹配其前面的字符0或1次即可有可无 匹配其前面的字符至少1次即肯定有{n} 匹配前面的字符n次{m,n} 匹配前面的字符至少m次至多n次3.2.3 位置锚定 ^ 行首错定用于模式的最左侧 $ 行尾错定用于模式的最右侧 \ 或 \b 词首错定用于单词模式的左侧 \ 或 \b 词尾错定用于单词模式的右侧3.2.4 分组其它 () 分组 后向引用\1\2... | 或者 a|b #a或b c|cat #C或cat (c|c)at #Cat或cat4 文本处理三剑客 4.1 文本处理三剑客之 grep grep Global search REgular expression and Print out the line 作用文本搜索工具根据用户指定的“模式”对目标文本逐行进行匹配检查打印匹配到的行模式由正则表达式字符及文本字符所编写的过滤条件 格式 grep [OPTIONS] PATTERN [FILE...]常见选项 --colorauto 对匹配到的文本着色显示 -m # 匹配#次后停止 -v 显示不被pattern匹配到的行 -i 忽略字符大小写 -n 显示匹配的行号 -c 统计匹配的总行数 -o 仅显示匹配到的字符串 -q 静默模式不输出任何信息 -A # after显示带上后#行 -B # before显示带上前#行 -C # context 显示带上前后各#行 -e 实现多个选项间的逻辑or关系,如 grep -e cat-e dog file -w 匹配整个单词 -E 使用ERE,相当于egrep -F 相当于fgrep不支持正则表达式 -f file 根据模式文件处理 -r 递归目录不处理软链接 -R 递归目录处理软链接例 #grep -e root -e bash /etc/passwd 查询passwd下包含root或bash的行 root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin joyce:x:1000:1000:Joyce:/home/joyce:/bin/bash nana:x:1001:1001::/home/nana:/bin/bash#grep root /etc/passwd|grep bash 查询passwd下同时包含root和bash的行 root:x:0:0:root:/root:/bin/bash##3过滤出f2和f3两个文件的相同行文件本身没有重复 #cat f2.txt a b 1 c #cat f3.txt b e f c 1 2 #cat f2.txt f3.txt a b 1 c b e f c 1 2 #grep -f f2.txt f3.txt b c 1// 4输出df下的包含ip地址所在行的第一个地址 #ifconfig ens160 |egrep -o [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|head -1 10.0.0.201 #ifconfig ens160 |egrep -o ([0-9]{1,3}\.){3}[0-9]{1,3}|head -1 10.0.0.201注意:地址数字后的.前要加\转义否则代表任意字符而不是地址中的. #cat /data/nianling.txt 输出nianling.txt文件中几个人年龄之和 a20 b18 c22 #cat /data/nianling.txt |cut -d -f2|tr \n |grep -Eo .*[0-9]|bc 60#cat /data/nianling.txt |cut -d -f2|tr \n |grep -Eo .*[0-9]|bc 60#cat /data/nianling.txt |grep -Eo [0-9]|tr \n |grep -Eo .*[0-9]|bc 60#grep -Eo [0-9] nianling.txt|tr \n |grep -Eo .*[0-9]|bc 604.2 文本处理三剑客之 sed 4.2.1 sed 工作原理 sed 即 Stream EDitor和 vi 不同sed是行编辑器 Sed是从文件或管道中读取一行处理一行输出一行;再读取一行再处理一行再输出一行直到最后一行.每当处理一行时把当前处理的行存储在临时缓冲区中称为模式空间(Pattern Space) 接着用sed命令处理缓冲区中的内容处理完成后把缓冲区的内容送往屏幕。接着处理下一行这样不断重复直到文件末尾。一次处理一行的设计模式使得sed性能很高sed在读取大文件时不会出现卡顿的现象。 如果使用vi命令打开几十M上百M的文件明显会出现有卡顿的现象这是因为vi命令打开文件是一次性将文件加载到内存然后再打开。 Sed就避免了这种情况一行一行的处理打开速度非常快执行速度也很快 参考网站 http://www.gnu.org/software/sed/manual/sed.html 修改是的模式空间即内存空间并非文件 4.2.2 sed 基本用法 格式 sed [option]... script;script;... inputfile...常用选项 -n 不输出模式空间内容到屏幕即关闭自动打印 -e 多点编辑 -f /PATH/SCRIPT_FILE 从指定文件中读取编辑脚本 -r,-E 使用扩展正则表达式 -i.bak 备份文件并原处编辑script格式 地址命令地址格式 1. 不给地址 对全文进行处理2. 单地址#:指定的行$:最后一行/pattern/:被此处模式所能够匹配到的每一行3. 地址范围:#,# 第几行到第几行#,# 第几行到后面几行/pat1/,/pat2/ 从哪个模式到哪个模式#,/pat/ 从第几行到哪个模式4. 步进:~1~2 奇数行2~2 偶数行例 [rootCentOS8 data]#sed -n /^[^#]/p /etc/fstab 打印/etc/fstab中非#开头的行 UUIDf2c173be-7848-43e9-9d0b-da0f1841f93f / xfs defaults 0 0 UUID54ead45a-7577-4b54-9de2-501aef04207a /boot ext4 defaults 1 2 UUID499afcaa-85a4-4b87-9223-20497b0bcf94 /data xfs defaults 0 0[rootCentOS8 data]#sed -n /root/p passwd 范围查找包含root的 root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin[rootCentOS8 data]#nl passwd | sed -n 3,6p 从3到6行3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6 sync:x:5:0:sync:/sbin:/bin/sync[rootCentOS8 data]#nl passwd | sed -n 3,1p 从3到314行3 daemon:x:2:2:daemon:/sbin:/sbin/nologin4 adm:x:3:4:adm:/var/adm:/sbin/nologin[rootCentOS8 data]#sed -n /^d/,/^s/p passwd 找到d开头到s开头的行 daemon:x:2:2:daemon:/sbin:/sbin/nologin d开头 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 s开头 dbus:x:81:81:System message bus:/:/sbin/nologin d开头 systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin s开头 dnsmasq:x:983:983:Dnsmasq DHCP and DNS server:/var/lib/dnsmasq:/sbin/nologin d开头 radvd:x:75:75:radvd user:/:/sbin/nologin sssd:x:982:982:User for sssd:/:/sbin/nologin s开头[rootCentOS8 data]#nl passwd | sed -n 1~2p 将passwd文件从1行开始2为间隔打印即1、3、5、7....1 root:x:0:0:root:/root:/bin/bash3 daemon:x:2:2:daemon:/sbin:/sbin/nologin5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin11 games:x:12:100:games:/usr/games:/sbin/nologin13 nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologi命令 p 打印当前模式空间内容追加到默认输出之后即打印显示(sed命令默认操作是自动打印再p会打印2次) Ip 忽略大小写输出 d 删除模式空间匹配的行并立即启用下一轮循环 a [\\]text 在指定行后面追加文本支持使用\n实现多行追加 i [\\]text 在行前面插入文本 c [\\]text 替换行为单行或多行文本 w /path/fiTe 保存模式匹配的行至指定文件 r /path/file 读取指定文件的文本至模式空间中匹配到的行后为模式空间中的行打印行号 ! 模式空间中匹配行取反处理s/pattern/string/修饰符 查找替换支持使用其它分隔符可以是其它形式 ss### 替换修饰符: g 行内全局替换而不是只替换第一个 p 显示替换成功的行 w /PATH/FILE 将替换成功的行保存至文件中 I,i 忽略大小写例 [rootCentOS8 data]#sed -n /root/!p passwd 打印不包含root的行 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[rootCentOS8 data]#seq 10 | sed 5,8a\ abc \n123 在第5行后至第8行追加\ abc加\转义 空格然后\n换行加123 1 2 3 4 5abc 123 6abc 123 7abc 123 8abc 123 9 10[rootCentOS8 data]#seq 10 | sed 5,8c\ abc \n123 将第五行到第八行换成 abc\n123 1 2 3 4abc 123 9 10[rootCentOS8 data]#seq 10 | sed -e 5a\abc -e 5i\123 在第五行前加123后加abc 1 2 3 4 123 5 abc 6 7 8 9 10[rootCentOS8 data]#seq 10 | sed -n 1,4w /data/seq.log 将seq 10生成的1到4行写入到seq.log文件中 [rootCentOS8 data]#cat seq.log 1 2 3 4[rootCentOS8 data]#seq 10 | sed 2,5r /etc/issue 将seq 10生成的2到5行后面都加上issue文件的内容 1 2 Time at \t Terminal on \l\S Kernel \r on an \m3 Time at \t Terminal on \l\S Kernel \r on an \m4 Time at \t Terminal on \l\S Kernel \r on an \m5 Time at \t Terminal on \l\S Kernel \r on an \m6 7 8 9 10[rootcentos8_2 ~]#sed -Ei.bak s/^(SELINUX).*/\1enforcing/ /etc/selinux/config 将config文件里SELINUX后面的字符替换为enforcing()分组后使用\1替代将grub文件里以GRUB_CMDLINE_LINUX开头的行其中以为结尾的前面加上net.ifnames0即修改网卡配置 [rootcentos8_2 ~]#sed -Ei.bak /^GRUB_CMDLINE_LINUX/s/(.*)$/\1 net.ifnames0/ /etc/default/grub [rootcentos8_2 ~]#sed -Ei.bak s/quiet/quiet net.ifnames0/ /etc/default/grub [rootcentos8_2 ~]#sed -Ei.bak /^GRUB_CMDLINE_LINUX/s/(.*)()$/\1 net.ifnames0\2/ /etc/default/grub例修改网卡名称 [rootcentos8 ~]#sed -ri /AGRUBCMDLINE_LINUX/s$ net.ifnames0 /etc/default/grub #centos7,8: [rootcentos8 ~]#grub2-mkconfig -o /boot/grub2/grub.cfg #ubuntu: [rootubuntu ~]#grub-mkconfig -o /boot/grub/grub.cfg范例取基名和目录名 echo /etc/sysconfig/network-scripts/ |sed -r s#(^/.*/)([^/]/?)#\2# 取基名 echo /etc/sysconfig/network-scripts/ |sed -r s#(^/.*/)([^/]/?)#\1# 取目录#取目录名 [rootcentos8 ~]#echo /etc/sysconfig/ |sed -rn s#(.*)/([^/])/?#\1#p /etc #取基名 [rootcentos8 ~]#echo /etc/sysconfig/ |sed -rn s#(.*)/([^/])/?#\2#p sysconfig同一个文件 [rootcentos8 ~]#sed -ri.bak /^#/!s/^/#/ /etc/fstab 在非#开头的行首加上# [rootcentos8 ~]#sed -ri.bak /^#/!s/$/#/ /etc/fstab 在非#开头的行尾加上# [rootCentOS8 ~]#sed -r /default/s/(defaults)/#\1/ /etc/fstab 在defaults的前面加上# [rootCentOS8 data]#sed -r /default/s/(defaults)/$PS1\1/ /etc/fstab 在default前面加上变量$PS1要使变量显示使用双引号[rootCentOS8 data]#sed -r /default/s/(defaults)/$PS1\1/ /etc/fstab 或使用单引号但在变量前后各加三个亲测失败4.2.3 sed 高级用法 sed 中除了模式空间还另外还支持保持空间 (Hold space),利用此空间可以将模式空间中的数据临时保存到保持空间从而后续接着处理实现更为强大的功能。 常见的高级命令 P 打印模式空间开端至\n内容并追加到默认输出之前 h 把模式空间中的内容覆盖至保持空间中 H 把模式空间中的内容追加至保持空间中 g 从保持空间取出数据覆盖至模式空间 G 从保持空间取出内容追加至模式空间 x 把模式空间中的内容与保持空间中的内容进行互换 n 读取匹配到的行的下一行覆盖至模式空间 N 读取匹配到的行的下一行追加至模式空间 d 删除模式空间中的行 D 如果模式空间包含换行符则删除直到第一个换行符的模式空间中的文本并不会读取新的输入行而使用合成的模式空间重新启动循环。如果模式空间不包含换行符则会像发出d命令那样启动正常的新循环范例 sed -n n;p FILE sed 1!G;h;$!d FILE sed N;D FILE seq 10 | sed 3h;9G;9!d sed $!N;$!D FILE sed $!d FILE sed G FILE sed g FILE sed /^$/d;G FILE sed n;d FILE sed -n 1!G;h;$p FILE例 [rootCentOS8 data]#seq 4 | sed -n n;p 打印偶数行 2 4[rootCentOS8 data]#seq 4 | sed 1!G;h;$!d 倒序显示 4 3 2 1[rootCentOS8 data]#seq 4 | sed N;D 打印最后一行 44.3 文本处理三剑客之 awk 4.3.1 awk 工作原理和基本用法说明 **awk Aho, Weinberger,Kernighan报告生成器**格式化文本输出GNU/Linux发布的AWK目前由自由软件基金会 (FSF) 进行开发和维护通常也称它为 GNU AWK 有多种版本 AWK原先来源于 AT T实验室的的AWKNAWKNew awkAT T实验室的AWK的升级版GAWK即GNU AWK。所有的GNU/Linux发布版都自带GAWK它与AWK和NAWK完全兼容 gawk 模式扫描和处理语言可以实现下面功能 文本处理输出格式化的文本报表执行算数运算执行字符串操作 格式 awk [options] program varvalue file.. awk [options] -f programfile varvalue file...说明 program通常是被放在单引号中并可以由三种部分组成 BEGIN语句块模式匹配的通用语句块END语句块 常见选项 -F“分隔符” 指明输入时用到的字段分隔符默认的分隔符是若干个连续的空白符-V varvalue变量赋值 Program格式 pattern{action statements;..}pattern 决定动作语句何时触发及触发事件比如 BEGIN(整个文件处理前先进行)END(整个文件处理后再执行)正则表达式等 action statements对数据进行处理放在{}内指明常见printprintf awk 工作过程 第一步 执行BEGINaction;…语句块中的语句第二步 从文件或标准输入(stdin)读取一行然后执行pattern action;… 语句块它逐行扫描文件从第一行到最后一行重复这个过程直到文件全部被读取完毕。第三步 当读至输入流未尾时执行ENDaction;…}语句块 BEGIN语句块在awk开婚从输入流中读取行之前被执行这是一个可选的语句块比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中 END语句块在awk从输入流中读取完所有的行之后即被执行比如打印所有行的分析结果这类信息汇总都是在END语句块中完成它也是一个可选语句块 patern语句块中的通用命令是最重要的部分也是可选的。如果没有提供pattern语句块则默认执行{print}即打印每一个读取到的行awk读取的每一行都会执行该语句块 分割符、域和记录 由分隔符分隔的字段(列column域field) 标记$1 2... 2... 2...n称为域标识 0 为所有域注意和 s h e l 中变量 0为所有域注意和shel中变量 0为所有域注意和shel中变量符含义不同文件的每一行称为记录record如果省略action则默认执行 print $0打印整行 的操作 常用的action分类 output statements print,printfExpressions 算术比较表达式等Compound statements 组合语句Control statements if, while等input statements awk控制语句 { statements;…} 组合语句if(condition) {statements;…}if(condition) {statements;…} else {statements;…}while(conditon){statments;…}do {statements;…} while(condition)for(expr1;expr2;expr3) {statements;…}breakcontinueexit 例 [rootCentOS8 test]#cat awk_1-scripts {print script\t$1\t$2} [rootCentOS8 test]#awk -F: -f awk_1-scripts scriptawk /etc/passwd|head -5 awk root x awk bin x awk daemon x awk adm x awk lp x4.3.2 print 和 printf 4.3.2.1 动作print 格式 print item1 item2,说明 逗号分隔符输出item可以字符串也可是数值;当前记录的字段、变量或awk的表达式如省略item相当于print $0如果打印固定字符串必须加双引号否则awk认为是变量或数字 例 [rootCentOS8 ~]#awk {print ok} #固定字符串要加双引号 hello ok ohno ok yes ok z ok [rootCentOS8 ~]#seq 5 | awk {print ok} ok ok ok ok ok[rootCentOS8 ~]#awk {print 2*3} das 6 czxc 6 sada 6 [rootCentOS8 ~]#seq 3|awk {print 2*3} 6 6 6[rootCentOS8 ~]#awk -F: {print okk} /etc/issue #issue有几行打印几次okkk okk okk okk okk okk okk okk [rootCentOS8 ~]#awk {print okk} /etc/issue okk okk okk okk okk okk okk [rootCentOS8 ~]#awk {print} /etc/issue Time at \t Terminal on \l\S Kernel \r on an \m[rootCentOS8 ~]#awk -F: {print} /etc/issue Time at \t Terminal on \l\S Kernel \r on an \m[rootCentOS8 ~]#awk -F: {print $0} /etc/issue Time at \t Terminal on \l\S Kernel \r on an \m[rootCentOS8 ~]#awk -F: {print $1} /etc/passwd | head -5 #以:为分隔符打印passwd文件的第一列 root bin daemon adm lp[rootCentOS8 ~]#awk -F: {print $1:$3} /etc/passwd | head -5 root:0 bin:1 daemon:2 adm:3 lp:4[rootCentOS8 ~]#awk -F: {print $1,$3} /etc/passwd | head -5 root 0 bin 1 daemon 2 adm 3 lp 4[rootCentOS8 ~]#awk -F: {print $1\t$3} /etc/passwd | head -5 root 0 bin 1 daemon 2 adm 3 lp 4[rootCentOS8 test]#awk -F: {sexmale;print $1,sex,age;age18} /etc/passwd |head -5 root male #第一行age没有值第二行开始赋值才有 bin male 18 daemon male 18 adm male 18 lp male 18例:取出df下文件系统和分区利用率 [rootCentOS8 ~]#df | awk {print $1\t$5} #单awk Filesystem Use% devtmpfs 0% tmpfs 0% tmpfs 1% tmpfs 0% /dev/sda2 40% /dev/sda3 1% /dev/sda1 21% tmpfs 1% tmpfs 0% [rootCentOS8 ~]#df | awk {print $1\t$5}|awk -F% {print $1} #双awk Filesystem Use devtmpfs 0 tmpfs 0 tmpfs 1 tmpfs 0 /dev/sda2 40 /dev/sda3 1 /dev/sda1 21 tmpfs 1 tmpfs 0 [rootCentOS8 ~]#df | awk {print $1\t$5}| tr -d % #awktr Filesystem Use devtmpfs 0 tmpfs 0 tmpfs 1 tmpfs 0 /dev/sda2 40 /dev/sda3 1 /dev/sda1 21 tmpfs 1 tmpfs 0 [rootCentOS8 ~]#df | awk -F |% {print $1,$5} #带两个分隔符的awk扩展的正则表达式 Filesystem Use devtmpfs 0 tmpfs 0 tmpfs 1 tmpfs 0 /dev/sda2 40 /dev/sda3 1 /dev/sda1 21 tmpfs 1 tmpfs 0 [rootCentOS8 ~]#df | awk -F[[:space:]]|% {print $1,$5} #带两个分隔符的awk Filesystem Use devtmpfs 0 tmpfs 0 tmpfs 1 tmpfs 0 /dev/sda2 40 /dev/sda3 1 /dev/sda1 21 tmpfs 1 tmpfs 0#取出特定文件系统grep实现 [rootCentOS8 ~]#df |grep ^/dev/sd | awk -F[[:space:]]|% {print $1,$5} /dev/sda2 40 /dev/sda3 1 /dev/sda1 21 #取出特定文件系统正则表达式实现 [rootCentOS8 ~]#df | awk -F[[:space:]]|% /^\/dev\/sd/{print $1,$5} /dev/sda2 40 /dev/sda3 1 /dev/sda1 21例取出ifconfig里的ip地址 [rootCentOS8 ~]#ifconfig eth0 | awk -F /netmask/{print $3} 10.0.0.201 [rootCentOS8 ~]#ifconfig eth0 | awk /netmask/{print $2} 10.0.0.201 [rootCentOS8 ~]#ifconfig eth0 | sed -rn 2s/^[^0-9]([0-9.]) .*$/\1/p #sed实现C678均可使用 10.0.0.201 [rootCentOS8 test]#ifconfig eth0 | awk -F NR2{print $3} 10.0.0.201 #NR范例 取出日志里网站访问量最大的前3个IP [rootVM_0_10_centos logs]# awk {print $1} nginx.access.log-20200428| sort| uniq -c|sort -nr|head -35498 122.51.38.202161 117.157.173.214953 211.159.177.120[rootcentos8 ~]#awk {print $1} access_log| sort| uniq -c|sort -nr|head -34870 172.20.116.2283429 172.20.116.2082834 172.20.0.2222613 172.20.112.14面试题 文件hosts.log 如下格式请提取joyce.com前面的主机名部分并追加到该文件后方 [rootCentOS8 ~]#cat hosts.log 1 www.joyce.com 2 blog.joyce.com 3 study.joyce.com 4 linux.joyce.com 5 C.joyce.com [rootCentOS8 ~]#awk -F[ .] {print $2} hosts.log www blog study linux C [rootCentOS8 ~]#awk -F[ .] {print $2} hosts.log hosts.log [rootCentOS8 ~]#cat hosts.log 1 www.joyce.com 2 blog.joyce.com 3 study.joyce.com 4 linux.joyce.com 5 C.joyce.com www blog study linux C4.3.2.2 动作 prinitf printf 可以实现格式化输出 格式 printf “FORMAT”item1 item2,...说明 必须指定FORMAT不会自动换行需要显式给出换行控制符\nFORMAT中需要分别为后面每个item指定格式符 格式符 与item一一对应 %c 显示字符的ASCII码%d,%i 显示十进制整数%e,%E 显示科学计数法数值%f 显示为浮点数%g,%G 以科学计数法或浮点形式显示数值%s显示字符串%u无符号整数%% 显示%自身 修饰符 #[.#] 第一个数字控制显示的宽度 第二个#表示小数点后精度如 %3.1f - 左对齐(默认右对齐) 如 %-15s显示数值的正负符号 如 %d例 [rootCentOS8 test]#awk -F: {printf %s,$1} /etc/passwd rootbindaemonadmlpsyncshutdownhaltmailoperatorgamesftpnobodydbussystemd-coredumpsystemd-resolvetsspolkitdgeocluertkitpipewirepulseqemuusbmuxdunboundglusterrpcavahichronysaslauthlibstoragemgmtdnsmasqradvdsssdcockpit-wscockpit-wsinstancecolordrpcusersetroubleshootflatpakgdmclevisgnome-initial-setuptcpdumpsshdjoycepostfixnanamysqljoyceeapacheTomAlicepcp [rootCentOS8 test]#awk -F: {printf %s\n,$1} /etc/passwd | head -5 root bin daemon adm lp [rootCentOS8 test]#awk -F: {printf %10s\n,$1} /etc/passwd | head -5rootbindaemonadmlp [rootCentOS8 test]#awk -F: {printf %-10s\n,$1} /etc/passwd | head -5 root bin daemon adm lp [rootCentOS8 test]#awk -F: {printf %-10s %10d\n,$1,$3} /etc/passwd | head -5 root 0 #注意要让$1/$3在同一行前面不加\n后面加 bin 1 #-负数左对齐 daemon 2 adm 3 lp 4 [rootCentOS8 test]#awk -F: {printf %10s %10d\n,$1,$3} /etc/passwd | head -5root 0bin 1daemon 2adm 3lp 4[rootCentOS8 test]#awk -F: BEGIN{print ------------------------}{printf %-10s | %10d\n------------------------\n,$1,$3} /etc/passwd | head -10 ------------------------ root | 0 ------------------------ bin | 1 ------------------------ daemon | 2 ------------------------ adm | 3 ------------------------ lp | 4 [rootCentOS8 test]#awk -F: {printf %-10s | %10d\n------------------------\n,$1,$3} /etc/passwd | head -10 root | 0 ------------------------ bin | 1 ------------------------ daemon | 2 ------------------------ adm | 3 ------------------------ lp | 4 ------------------------[rootCentOS8 test]#awk -F: {printf UserName: %s\n,$1} /etc/passwd |head -5 UserName: root UserName: bin UserName: daemon UserName: adm UserName: lp[rootCentOS8 test]#awk -F: {printf UserName: %s %3.3f\n,$1,$3} /etc/passwd |head -5 UserName: root 0.000 UserName: bin 1.000 UserName: daemon 2.000 UserName: adm 3.000 UserName: lp 4.000 [rootCentOS8 test]#awk -F: {printf UserName: %10s %10.3f\n,$1,$3} /etc/passwd |head -5 UserName: root 0.000 UserName: bin 1.000 UserName: daemon 2.000 UserName: adm 3.000 UserName: lp 4.0004.3.3 awk变量 awk中的变量分为内置和自定义变量 常见的内置变量 4.3.3.1 FS 输入字段分隔符默认为空白字符,功能相当于 -F 范例 [rootCentOS8 ~]#awk -v FS: {print $1} /etc/passwd | head -5 root bin daemon adm lp [rootCentOS8 ~]#awk -v FS: {print $1FS$3} /etc/passwd | head -5 root:0 bin:1 daemon:2 adm:3 lp:4 [rootCentOS8 ~]#S:; awk -v FS$S {print $1FS$3} /etc/passwd | head -5 root:0 bin:1 daemon:2 adm:3 lp:4 [rootCentOS8 ~]#S:; awk -F$S {print $1,$3} /etc/passwd | head -5 root 0 bin 1 daemon 2 adm 3 lp 4#同时存在两个类型的分隔符时后面的生效 [rootCentOS8 ~]#awk -v FS: -F- {print $1FS$3} /etc/passwd | head -5 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- [rootCentOS8 ~]#awk -F- -v FS: {print $1FS$3} /etc/passwd | head -5 root:0 bin:1 daemon:2 adm:3 lp:44.3.3.2 OFS 输出字段分隔符默认为空白字符** 范例 [rootCentOS8 ~]#awk -F: {print $1,$3} /etc/passwd | head -5 root 0 bin 1 daemon 2 adm 3 lp 4 [rootCentOS8 ~]#awk -F: -v OFS-- {print $1,$3} /etc/passwd | head -5 root--0 bin--1 daemon--2 adm--3 lp--44.3.3.3 RS 输入记录分隔符指定输入时的换行符 范例 [rootCentOS8 test]#cat test1.txt a,b,c;12 33,44,55;AA CC [rootCentOS8 test]#awk -F, {print $1,$3} test1.txt a c;12 33 55;AA CC [rootCentOS8 test]#awk -F, -v RS; {print $1,$3} test1.txt a c 12 33 55 AA CC [rootCentOS8 test]#awk -v FS, -v RS; {print $1,$3} test1.txt a c 12 33 55 AA CC4.3.3.4 ORS 输出记录分隔符输出时用指定符号代替换行符** [rootCentOS8 test]#awk -v FS, -v RS; -v ORS| {print $1,$3} test1.txt a c|12 #因为本身有换行所以这里会换行 33 55|AA CC|4.3.3.5 NF 字段数量 [rootCentOS8 test]#]#awk -v FS, -v RS; {print NF} test1.txt 3 3 1 [rootCentOS8 test]#awk -F: {print NF} /etc/passwd | head -4 7 7 7 7 [rootCentOS8 test]#awk -F: {print $NF} /etc/passwd | head -4 /bin/bash #取倒数第一列即最后一列 /sbin/nologin /sbin/nologin /sbin/nologin [rootCentOS8 test]#awk -F: {print $1,$NF} /etc/passwd | head -4 root /bin/bash #取第一列和倒数第一列即最后一列 bin /sbin/nologin daemon /sbin/nologin adm /sbin/nologin [rootCentOS8 test]#awk -F: {print $1\t$NF} /etc/passwd | head -4 root /bin/bash #取第一列和倒数第一列即最后一列 bin /sbin/nologin daemon /sbin/nologin adm /sbin/nologin [rootCentOS8 test]#awk -F: {print $(NF-1)} /etc/passwd | head -4 /root #取倒数第二列 /bin /sbin /var/adm 例提取/misc/cd/BaseOS/Packages/*.rpm的架构后缀 [rootCentOS8 test]#ls /misc/cd/BaseOS/Packages/*.rpm | head -5 /misc/cd/BaseOS/Packages/aajohan-comfortaa-fonts-3.001-2.el8.noarch.rpm /misc/cd/BaseOS/Packages/accel-config-3.1-1.el8.i686.rpm /misc/cd/BaseOS/Packages/accel-config-3.1-1.el8.x86_64.rpm /misc/cd/BaseOS/Packages/accel-config-libs-3.1-1.el8.i686.rpm /misc/cd/BaseOS/Packages/accel-config-libs-3.1-1.el8.x86_64.rpm [rootCentOS8 test]#ls /misc/cd/BaseOS/Packages/*.rpm | awk -F. {print $(NF-1)}|sort | uniq -c403 i686224 noarch1082 x86_64例取出ss -nt 下访问数最多的ip [rootCentOS8 ~]#ss -nt State Recv-Q Send-Q Local Address:Port Peer Address:Port Process ESTAB 0 0 10.0.0.201:22 10.0.0.1:58285 ESTAB 0 48 10.0.0.201:22 10.0.0.1:61841 ESTAB 0 0 10.0.0.201:53854 151.101.1.91:443 ESTAB 0 0 10.0.0.201:22 10.0.0.1:61842 [rootCentOS8 ~]#ss -nt | awk -F |: {print $(NF-2)} Address #号代表一个以上 10.0.0.1 10.0.0.1 151.101.1.91 10.0.0.1 [rootCentOS8 ~]#ss -nt | awk -F |: {print $(NF-2)}| sort| uniq -c3 10.0.0.11 151.101.1.911 Address [rootCentOS8 ~]#ss -nt | awk -F |: /^ESTAB/{print $(NF-2)}| sort| uniq -c|sort -nr|head -23 10.0.0.1 #仅包含ESTAB开头的1 151.101.1.91例脚本将ip地址访问次数最多的2个地址加入到防火墙 [rootCentOS8 test]#cat through_into_firewall.sh #!/bin/bashIPLIST ss -nt | awk -F |: /^ESTAB/{print $(NF-2)}| sort| uniq -c|sort -nr|head -2|awk {print $2} for ip in $IPLIST ;doiptables -A INPUT -s $ip -j REJECT done例创建计划任务每10min将ip并发数大于100的ip地址加入黑名单 [rootCentOS8 ~]#cat /test/deny_dos.sh LINK100 while true;doss -nt I awk -F[[:space:]]: /AESTAB/[print S(NF-2)]sort luniq -clwhile read count ip;doif [ $count -gt $LINK ];theniptables -A INPUT -s $ip -j REJECTfidone done [rootCentOS8 test]#chmod x /test/deny_dos.sh [rootCentOS8 test]#crontab -e */10 * * * * * /test/deny_dos.sh4.3.3.6 NR 记录的编号可以反映行数 例 [rootCentOS8 test]#seq 5 | awk {print NR} 1 2 3 4 5 [rootCentOS8 test]#awk {print NR} /etc/passwd |head -7 1 2 3 4 5 6 7 [rootCentOS8 test]#awk NR3 /etc/passwd #显示第二行的信息 daemon:x:2:2:daemon:/sbin:/sbin/nologin [rootCentOS8 test]#ifconfig eth0 | awk -F NR2{print $3} #显示第二行 10.0.0.201[rootCentOS8 test]#cat test1.txt a,b,c;12 33,44,55;AA CC[rootCentOS8 test]#awk -v RS; {print NR} test1.txt 1 2 3 [rootCentOS8 test]#awk -v RS; {print NR,$0} test1.txt 1 a,b,c 2 12 33,44,55 3 AA CC#多文件会合并再一次 [rootCentOS8 test]#awk {print NR,$0} /etc/issue /etc/centos-release 1 Time at \t 2 Terminal on \l 3 4 5 \S 6 Kernel \r on an \m 7 8 CentOS Linux release 8.5.21114.3.3.7 FNR 各文件分别记录 例 [rootCentOS8 test]#awk {print NR,$0} /etc/issue /etc/centos-release 1 Time at \t #NR合并再一次 2 Terminal on \l 3 4 5 \S 6 Kernel \r on an \m 7 8 CentOS Linux release 8.5.2111 [rootCentOS8 test]#awk {print FNR,$0} /etc/issue /etc/centos-release 1 Time at \t #FNR分别记录编号 2 Terminal on \l 3 4 5 \S 6 Kernel \r on an \m 7 1 CentOS Linux release 8.5.21114.3.3.8 FILENAME 显示当前文件名 [rootCentOS8 test]#awk {print FNR,FILENAME,$0} /etc/issue /etc/centos-release 1 /etc/issue Time at \t 2 /etc/issue Terminal on \l 3 /etc/issue 4 /etc/issue 5 /etc/issue \S 6 /etc/issue Kernel \r on an \m 7 /etc/issue 1 /etc/centos-release CentOS Linux release 8.5.21114.3.3.9 ARGC 命令行参数的个数 [rootCentOS8 test]#awk {print ARGC} /etc/issue /etc/centos-release 3 3 3 3 3 3 3 3 [rootCentOS8 test]#awk -F: {print ARGC} /etc/issue /etc/centos-release 3 3 3 3 3 3 3 34.3.3.10 ARGV **数组保存命令行所给定的各参数第一个参数ARGV[0]第二个ARGV[1]… ** [rootCentOS8 test]#awk -F: {print ARGV[0],ARGV[1],ARGV[2]} /etc/issue /etc/centos-release awk /etc/issue /etc/centos-release awk /etc/issue /etc/centos-release awk /etc/issue /etc/centos-release awk /etc/issue /etc/centos-release awk /etc/issue /etc/centos-release awk /etc/issue /etc/centos-release awk /etc/issue /etc/centos-release awk /etc/issue /etc/centos-release4.3.4 操作符 4.3.4.1 算术操作符 xyx-yx*yx/yx^y x%y -x转换为负数 x将字符串转换为数值字符串操作符没有符号的操作符字符串连接 4.3.4.2 赋值操作符 -* /%^--例 [rootCentOS8 test]#awk BEGIN{print 3*4} 12 [rootCentOS8 test]#awk BEGIN{i0;print i,i} 1 1 [rootCentOS8 test]#awk BEGIN{i0;print i,i} 0 1 [rootCentOS8 test]#awk -v n0 !n /etc/passwd #等价于下一个 root:x:0:0:root:/root:/bin/bash #!n满足不为0才执行后面print [rootCentOS8 test]#awk -v n0 !n{print $0} /etc/passwd root:x:0:0:root:/root:/bin/bash [rootCentOS8 test]#awk -v n0 !n{print n} /etc/passwd 1[rootCentOS8 test]#awk -v n0 !n{print n} /etc/passwd [rootCentOS8 test]#awk -v n-1 !n{print n} /etc/passwd 0 [rootCentOS8 test]#awk -v n1 !n{print n} /etc/passwd4.3.4.3 比较操作符 !例 [rootCentOS8 test]#awk NR2 /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin[rootCentOS8 test]#awk -F: $31000 /etc/passwd nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin joyce:x:1000:1000:Joyce:/home/joyce:/bin/bash nana:x:1001:1001::/home/nana:/bin/bash joycee:x:1002:1002::/home/joycee:/bin/bash Tom:x:1003:1003::/home/Tom:/bin/bash Alice:x:1004:1004::/home/Alice:/bin/bash 例:取奇偶数行 [rootCentOS8 test]#awk NR%20 /etc/passwd |head -5 bin:x:1:1:bin:/bin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync halt:x:7:0:halt:/sbin:/sbin/halt operator:x:11:0:operator:/root:/sbin/nologin[rootCentOS8 test]#awk NR%21 /etc/passwd |head -5 root:x:0:0:root:/root:/bin/bash daemon:x:2:2:daemon:/sbin:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown mail:x:8:12:mail:/var/spool/mail:/sbin/nologin4.3.4.4 模式匹配符 ~ 左边是否和右边匹配包含关系 !~ 是否不匹配例 [rootCentOS8 test]#awk -F: $0 ~ /root/ /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [rootCentOS8 test]#awk -F: $0 !~ /root/ /etc/passwd |head -5 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/sync4.3.4.5 逻辑操作符: 与或||非!范例: [rootCentOS8 test]#awk -v i3 BEGIN{print !i} 0 [rootCentOS8 test]#awk -v i-3 BEGIN{print !i} 0 [rootCentOS8 test]#awk -v i0 BEGIN{print !i} 1 [rootCentOS8 test]#awk -v iasbda BEGIN{print !i} 0 [rootCentOS8 test]#awk -v i BEGIN{print !i} 1 [rootCentOS8 test]#awk -v i BEGIN{print !i} 1 [rootCentOS8 test]#awk -F: $3800 $31000 /etc/passwd|head -5 systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin polkitd:x:998:996:User for polkitd:/:/sbin/nologin geoclue:x:997:995:User for geoclue:/var/lib/geoclue:/sbin/nologin pipewire:x:996:992:PipeWire System Daemon:/var/run/pipewire:/sbin/nologin unbound:x:995:989:Unbound DNS resolver:/etc/unbound:/sbin/nologin [rootCentOS8 test]#awk -F: $3800 $31000 {print $1,$3} /etc/passwd|head -5 systemd-coredump 999 polkitd 998 geoclue 997 pipewire 996 unbound 995 [rootCentOS8 test]#awk -F: $30 || $31000 {print $1,$3} /etc/passwd|head -5 root 0 nobody 65534 joyce 1000 nana 1001 joycee 1002 [rootCentOS8 test]#awk -F: !($31000) {print $1,$3} /etc/passwd|head -5 root 0 bin 1 daemon 2 adm 3 lp 4 [rootCentOS8 test]#awk -F: ! $31000 {print $1,$3} /etc/passwd|head -5[rootCentOS8 test]#awk -F: ! $30 {print $1,$3} /etc/passwd|head -5 bin 1 daemon 2 adm 3 lp 4 sync 5 [rootCentOS8 test]#awk -F: !($30) {print $1,$3} /etc/passwd|head -5 bin 1 daemon 2 adm 3 lp 4 sync 5 例:取反的高级用法 [rootCentOS8 test]#seq 5|awk i0 1 2 3 4 5 [rootCentOS8 test]#seq 5|awk i0 [rootCentOS8 test]#seq 5|awk i1 1 2 3 4 5 [rootCentOS8 test]#seq 5|awk i!i 1 3 5 [rootCentOS8 test]#seq 5|awk !(i!i) 2 4 [rootCentOS8 test]#seq 5|awk -v i1 i!i 2 4 [rootCentOS8 test]#seq 5|awk {i!i;print i} 1 0 1 0 14.3.4.6 条件表达式(三目表达式) selector?if-true-expression:if-false-expression例 [rootCentOS8 test]#awk -F: {$31000?usertypeCommon User:usertypeSysUser;printf %-10s:%10s\n,$1,usertype} /etc/passwd|tail -5 #大于1000Common小于Sys joycee :Common User apache : SysUser Tom :Common User Alice :Common User pcp : SysUser4.3.5 模式PATTERN PATTERN:根据pattern条件过滤匹配的行再做处理 1 如果未指定 空模式匹配每一行 范例 [rootCentOS8 test]#awk -F: {print $1,$3} /etc/passwd |head -3 root 0 bin 1 daemon 22 /regular expression/ 仅处理能够模式匹配到的行需要用/ /括起来 范例 [rootCentOS8 test]#awk /^UUID/ /etc/fstab UUIDf2c173be-7848-43e9-9d0b-da0f1841f93f / xfs defaults 0 0 UUID54ead45a-7577-4b54-9de2-501aef04207a /boot ext4 defaults 1 2 UUID499afcaa-85a4-4b87-9223-20497b0bcf94 /data xfs defaults 0 0 UUID80ee59c8-b184-4f49-9039-5150257143b8 none swap defaults 0 0 [rootCentOS8 test]#awk /^UUID/{print $1} /etc/fstab UUIDf2c173be-7848-43e9-9d0b-da0f1841f93f UUID54ead45a-7577-4b54-9de2-501aef04207a UUID499afcaa-85a4-4b87-9223-20497b0bcf94 UUID80ee59c8-b184-4f49-9039-5150257143b8 [rootCentOS8 test]#awk /^UUID/{print $1,$2} /etc/fstab UUIDf2c173be-7848-43e9-9d0b-da0f1841f93f / UUID54ead45a-7577-4b54-9de2-501aef04207a /boot UUID499afcaa-85a4-4b87-9223-20497b0bcf94 /data UUID80ee59c8-b184-4f49-9039-5150257143b8 none[rootCentOS8 test]#awk !/^UUID/ /etc/fstab# # /etc/fstab # Created by anaconda on Tue May 30 15:28:42 2023 # # Accessible filesystems, by reference, are maintained under /dev/disk/. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. # # After editing this file, run systemctl daemon-reload to update systemd # units generated from this file. #3 relationalexpression 关系表达式结果为“真“才会被处理 真 结果为非0值非空字符串假 结果为空字符串或0值 [rootCentOS8 test]#awk 1 /etc/issue Time at \t Terminal on \l\S Kernel \r on an \m[rootCentOS8 test]#awk 0 /etc/issue [rootCentOS8 test]#awk as /etc/issue #未加认为是个变量而as变量未赋值默认是空即0print [rootCentOS8 test]#awk as /etc/issue Time at \t Terminal on \l\S Kernel \r on an \m[rootCentOS8 test]#awk -v as as /etc/issue [rootCentOS8 test]#awk -v as0 as /etc/issue [rootCentOS8 test]#awk -v as0 as /etc/issue[rootCentOS8 test]#awk /etc/issue [rootCentOS8 test]#awk 0 /etc/issue Time at \t Terminal on \l\S Kernel \r on an \m 例 [rootCentOS8 test]#awk -F: i1;j1{print i,j} /etc/passwd |head -6 root:x:0:0:root:/root:/bin/bash 1 1 bin:x:1:1:bin:/bin:/sbin/nologin 1 1 daemon:x:2:2:daemon:/sbin:/sbin/nologin 1 1 [rootCentOS8 test]#awk -F: i1{print $0};j1{print i,j} /etc/passwd |head -6 root:x:0:0:root:/root:/bin/bash 1 1 bin:x:1:1:bin:/bin:/sbin/nologin 1 1 daemon:x:2:2:daemon:/sbin:/sbin/nologin 1 1 [rootCentOS8 test]#awk -F: $NF/bin/bash{print $1,$NF} /etc/passwd root /bin/bash joyce /bin/bash nana /bin/bash joycee /bin/bash Tom /bin/bash Alice /bin/bash [rootCentOS8 test]#awk -F: $NF ~ /bash$/{print $1,$NF} /etc/passwd root /bin/bash #~模糊匹配bash为结尾的正则表达式 joyce /bin/bash nana /bin/bash joycee /bin/bash Tom /bin/bash Alice /bin/bash4 line ranges 行范围 不支持直接用行号但可以使用变量NR间接表示行号 /pat1/,/pat2/ 不支持直接给出数字格式例 [rootCentOS8 test]#awk NR3 NR6 /etc/passwd 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 [rootCentOS8 test]#sed -n 3,6p /etc/passwd #sed实现 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[rootCentOS8 test]#awk /^b/,/^s/ /etc/passwd #挑出b开头到s开头的行 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 [rootCentOS8 test]#awk /^b/,/^s/{print $0} /etc/passwd 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/sync5 BEGIN/END模式 BEGIN仅在开始处理文件中的文本之前执行一次END仅在文本处理完成之后执行一次 [rootCentOS8 test]#awk -F: BEGIN{print User UserID} {print $1\t$3} END{print END File} /etc/passwd User UserID root 0 bin 1 daemon 2 adm 3 ... pcp 974 END File [rootCentOS8 test]#4.3.6 条件判断 if-else 语法 if(condition){statement;...}[else statement] if(condition1){statementl}else if(condition2){statement2}else if(condition3){statement3}...else{statement3}使用场景对awk取得的整行或某个字段做条件判断 范例 [rootCentOS8 test]#awk -F: {if($31000)print Common User:$1,$3;else print SysUser:$1,$3} /etc/passwd |tail -4 SysUser:apache 48 Common User:Tom 1003 Common User:Alice 1004 SysUser:pcp 974[rootCentOS8 test]#awk BEGIN{test100;if(test90){print very good }else if(test60){ print good }else{print no pass}} very good [rootCentOS8 test]#awk BEGIN{test80;if(test90){print very good }else if(test60){ print good }else{print no pass}} good [rootCentOS8 test]#awk BEGIN{test50;if(test90){print very good }else if(test60){ print good }else{print no pass}} no pass例实现将磁盘空间大于30以上的磁盘显示出来 [rootCentOS8 test]#df Filesystem 1K-blocks Used Available Use% Mounted on devtmpfs 970012 0 970012 0% /dev tmpfs 998404 0 998404 0% /dev/shm tmpfs 998404 9512 988892 1% /run tmpfs 998404 0 998404 0% /sys/fs/cgroup /dev/sda2 104806400 41650236 63156164 40% / /dev/sda3 52403200 398776 52004424 1% /data /dev/sda1 999320 194568 735940 21% /boot tmpfs 199680 12 199668 1% /run/user/42 tmpfs 199680 0 199680 0% /run/user/0 [rootCentOS8 test]#df -h | awk -F% /^\/dev\/sd/{print $1} | awk -F {if($NF30)print $1,$NF} /dev/sda2 40 [rootCentOS8 test]#df -h | awk -F |% /^\/dev\/sd/{if($530)print $1,$5} /dev/sda2 40 4.3.7 switch语句 语法 switch(expression) {case VALUE1 or /REGEXP/: statement1; case VALUE2 or /REGEXP2/: statement2; ...; default: statementn}4.3.8 循环while 语法 while (condition) {statement;....}条件”真”进入循环;条件”假”退出循环 使用场景 对一行内的多个字段逐一类似处理时使用对数组中的各元素逐一处理时使用 #内置函数length()返回字符数而非字节数 [rootCentOS8 test]#awk BEGIN{print length(HEllo Babe)} 10 [rootCentOS8 test]#awk BEGIN{print length(日本于24日排放核废水)} 11#逐个字段统计字段的字符个数 [rootCentOS7 ~]#awk /^[[:space:]]*linux16/{i1;while(iNF){print $i,length($i);i}} /etc/grub2.cfg linux16 7 /vmlinuz-3.10.0-1160.71.1.el7.x86_64 36 rootUUIDd02bdd48-4a76-4680-991c-bc5769984946 46 ro 2 rhgb 4 quiet 5 LANGen_US.UTF-8 16 linux16 7 /vmlinuz-0-rescue-fa775acad508426696d0a36b0c9e008b 50 rootUUIDd02bdd48-4a76-4680-991c-bc5769984946 46 ro 2 rhgb 4 quiet 5 [rootCentOS7 ~]#awk /^[[:space:]]*linux16/{i1;while(iNF){if(length($i)10)print $i,length($i);i}} /etc/grub2.cfg /vmlinuz-3.10.0-1160.71.1.el7.x86_64 36 rootUUIDd02bdd48-4a76-4680-991c-bc5769984946 46 LANGen_US.UTF-8 16 /vmlinuz-0-rescue-fa775acad508426696d0a36b0c9e008b 50 rootUUIDd02bdd48-4a76-4680-991c-bc5769984946 46例12…100 [rootCentOS7 ~]#awk BEGIN{sum0;i1;while(i100){sumi;i}print sum} 5050 [rootCentOS7 ~]#for i in {1..100};do let sumi;done;echo $sum 50504.3.9 循环 do-while 语法 do {statement;...}while(condition)意义无论真假至少执行一次循环体 例12…100 [rootCentOS7 ~]#awk BEGIN{total0;i1;do{totali;i}while(i100);print total} 50504.3.10 循环for 语法 for(expr1;expr2;expr3) {statement;...}常见用法 for(variable assignment;condition;iteration process) {for-body}特殊用法 能够遍历数组中的元素 for(var in array) {for-body} # var 每次循环都对应数组的下标例 [rootCentOS7 ~]#awk BEGIN{total0;for(i1;i100;i){totali};print total} 50504.3.11 continue和break 格式 continue [n] #中断本次循环 break [n] #中断整个循环[rootCentOS7 ~]#awk BEGIN{total0;for(i1;i100;i){if(i%20)continue;totali};print total} 2500 [rootCentOS7 ~]#awk BEGIN{total0;for(i1;i100;i){if(i50)break;totali};print total} 12254.3.12 next next 可以提前结束对本行处理而直接进入下一行处理 (awk自身循环) 范例 #只打印偶数行 [rootCentOS7 ~]#awk -F: {if($3%2!0) next;print $1,$3} /etc/passwd|head -5 root 0 daemon 2 lp 4 shutdown 6 mail 84.3.13 数组 awk的数组为关联数组 格式 array[index-expression]范例 weekdays[mon]Mondayindex-expression 利用数组实现k/v键值对功能可使用任意字符串;字符串要使用双引号括起来如果某数组元素事先不存在在引用时awk会自动创建此元素并将其值初始化为“空串”若要判断数组中是否存在某元素要使用“index in array”格式进行遍历 范例 [rootCentOS7 ~]#awk BEGIN{weekdays[mon]Monday;weekdays[tue]Tuesday;print weekdays[mon]} Monday例 [rootCentOS8 test]#cat test2.txt a bb ccc a b 11 ccc d 11 22 [rootCentOS8 test]#awk !line[$0] test2.txt a bb ccc b 11 d 22 #1、开始读入第一行line[a]未定义默认值是空即line[a]空 #2、因为line[a]空而前面有!取反则!line[a]真则有隐藏的{print $0}即打印这一行a #3、最后使line[a]1 #同理line[b]/line[ccc]也都变成1 #4、再次遇到a则line[a]1前面!取反则!line[a]0不打印这一行a即跳过a不过仍要后line[a]2 #同理遇到相同的b/ccc都会跳过 #因为每次都所以每次都会取反导致不打印这样就实现去重功能 [rootCentOS8 test]#awk {!line[$0];print $0,line[$0]} test2.txt a 1 bb 1 ccc 1 a 2 b 1 11 1 ccc 2 d 1 11 2 22 1 a 3例判断数组索引是否存在 [rootCentOS8 test]#awk BEGIN{array[i]x;array[j]y; print i in array,j in array} 1 1 [rootCentOS8 test]#awk BEGIN{array[i]x;array[j]y; print i in array,m in array} 1 0 [rootCentOS8 test]#awk BEGIN{array[i]x;array[j]y; print n in array,m in array} 0 0若要遍历数组中的每个元素要使用for循环 for(var in array) {for-body}注意 var会遍历array的每个索引 范例遍历数组 [rootCentOS8 ~]#awk BEGIN{weekdays[mon]Monday;weekdays[tue]Tuesday;weekdays[thu]Thursday;for(i in weekdays){print i:weekdays[i]}} tue:Tuesday thu:Thursday mon:Monday [rootCentOS8 ~]#awk BEGIN{weekdays[1]Monday;weekdays[2]Tuesday;weekdays[3]Thursday;for(i in weekdays){print i:weekdays[i]}} 1:Monday 2:Tuesday 3:Thursday[rootCentOS8 test]#awk -F: {user[$1]$3}END{for (i in user){print username: i,uid:user[i]}} /etc/passwd|head -5 username: adm uid:3 username: rpc uid:32 username: dnsmasq uid:983 username: flatpak uid:977 username: radvd uid:75例显示主机连接状态出现的次数 [rootCentOS8 test]#ss -nt | awk NR!1{print $1} |sort|uniq -c2 ESTAB [rootCentOS8 test]#ss -nt | awk NR!1{state[$1]}END{for(i in state){print i,state[i]}} ESTAB 2例将日志中主机连接数超过1000的ip拉黑 [rootCentOS8 test]#awk {ip[$1]}END{for(i in ip){if(ip[i]1000){system(iptables -A INPUT -s i -j REJECT)}}} file.log#下面是只打印而不拉黑 [rootCentOS8 test]#awk {ip[$1]}END{for(i in ip){if(ip[i]1000){print i,ip[i]}}} file.log4.3.14 awk函数 4.3.14.1 常见内置函数 4.3.14.1.1数值处理 rand() 返回0和1之间一个随机数 srand() 配合rand() 函数,生成随机数的种子 int() 返回整数范例 #1、未加随机数种子无法实现生成随机数 [rootCentOS8 test]#awk BEGIN{print rand()} 0.924046 [rootCentOS8 test]#awk BEGIN{print rand()} 0.924046 [rootCentOS8 test]#awk BEGIN{print rand()} 0.924046 #2、添加srand() [rootCentOS8 test]#awk BEGIN{srand();print rand()} 0.550635 [rootCentOS8 test]#awk BEGIN{srand();print rand()} 0.864986 #生成速度过快会生成同一个随机数 #生成100以下的随机数但是是小数 [rootCentOS8 test]#awk BEGIN{srand();print rand()*100} 88.9721 [rootCentOS8 test]#awk BEGIN{srand();print rand()*100} 88.9721 [rootCentOS8 test]#awk BEGIN{srand();print rand()*100} 81.6498 #生成100以下的整数 [rootCentOS8 test]#awk BEGIN{srand();print int(rand()*100)} 1 [rootCentOS8 test]#awk BEGIN{srand();print int(rand()*100)} 5 [rootCentOS8 test]#awk BEGIN{srand();print int(rand()*100)} 34 [rootCentOS8 test]#awk BEGIN{srand();print int(rand()*100)} 34 [rootCentOS8 test]#awk BEGIN{srand();print int(rand()*100)} 97 #生成10个100以下的随机整数 [rootCentOS8 test]#awk BEGIN{srand();for(i1;i10;i)print int(rand()*100)} 85 73 89 23 4 99 48 87 26 7 [rootCentOS8 test]#awk BEGIN{srand();for(i1;i10;i)print int(rand()*100)} 91 1 75 16 66 56 35 60 67 574.3.14.1.2字符串处理 4.3.14.1.2.1 length/sub length([s]) 返回指定字符串的长度 sub(r,s,[t]) 对t字符串搜索r表示模式匹配的内容并将第一个匹配内容替换为s范例 [rootcentos8 ~]#echo 2008:08:08 08:08:08 | awk sub(/:/,-,$1) 2008-08:08 08:08:08 #省略print $0 [rootcentos8 ~]#echo 2008:08:08 08:08:08 | awk {sub(/:/,-,$1);print $0} 2008-08:08 08:08:084.3.14.1.2.2 gsub gsub(r,s,[t]) 对t字符串进行搜索r表示的模式匹配的内容并全部替换为s所表示的内容范例 [rootCentOS8 test]#echo 2008:08:08 08:08:08 | awk gsub(/:/,-,$1) 2008-08-08 08:08:08 #省略print $0 [rootCentOS8 test]#echo 2008:08:08 08:08:08 | awk {gsub(/:/,-,$1);print $0} 2008-08-08 08:08:084.3.14.1.2.3 split split(s,array,[r]) 以r为分隔符切割字符串s并将切割后的结果保存至array所表示的数组中第一个索引值为1,第二个索引值为2....范例 [rootCentOS8 test]#netstat -tn Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 96 10.0.0.201:22 10.0.0.1:61841 ESTABLISHED tcp 0 0 10.0.0.201:22 10.0.0.1:61842 ESTABLISHED tcp6 0 0 10.0.0.201:9090 10.0.0.1:63167 TIME_WAIT tcp6 0 0 10.0.0.201:9090 10.0.0.1:63171 ESTABLISHED tcp6 0 0 10.0.0.201:9090 10.0.0.1:63168 TIME_WAIT tcp6 0 0 10.0.0.201:9090 10.0.0.1:63172 ESTABLISHED tcp6 0 0 10.0.0.201:9090 10.0.0.1:63165 ESTABLISHED tcp6 0 0 10.0.0.201:9090 10.0.0.1:63174 ESTABLISHED [rootCentOS8 test]#netstat -tn | awk /tcp/{split($5,ip,:);count[ip[1]]}END{for(i in count){print i,count[i]}} 10.0.0.1 84.3.14.1.2.4 system system 函数 可以awk中调用shell命令空格是awk中的字符串连接符如果system中需要使用awk中的变量可以使用空格分隔或者说除了awk的变量外其他一律用引用起来 例将日志中主机连接数超过1000的ip拉黑 [rootCentOS8 test]#awk {ip[$1]}END{for(i in ip){if(ip[i]1000){system(iptables -A INPUT -s i -j REJECT)}}} file.log#下面是只打印而不拉黑 [rootCentOS8 test]#awk {ip[$1]}END{for(i in ip){if(ip[i]1000){print i,ip[i]}}} file.log4.3.14.2 自定义函数 格式 function name ( parameter, parameter,...){statementsreturn expression }例取2个数中的较大值 [rootCentOS8 test]#cat func_max.awkfunction max(x,y) {xy?varx:varyreturn var } BEGIN{print max(a,b)} [rootCentOS8 test]#awk -v a33 -v b22 -f func_max.awk 334.3.15 awk脚本 将awk程序写成脚本直接调用或执行 例 [rootCentOS8 test]#cat passwd_1.awk {if($31000)print $1,$3}[rootCentOS8 test]#awk -F: -f passwd_1.awk /etc/passwd nobody 65534 joyce 1000 nana 1001 joycee 1002 Tom 1003 Alice 1004#把上面的直接写为脚本 [rootCentOS8 test]#cat passwd_2.awk #!/bin/awk -f #this is a awk script {if($31000)print $1,$3} [rootCentOS8 test]#chmod x passwd_2.awk [rootCentOS8 test]#./passwd_2.awk -F: /etc/passwd nobody 65534 joyce 1000 nana 1001 joycee 1002 Tom 1003 Alice 1004向awk脚本传递参数 格式 awkfile varvalue var2value2... Inputfile注意 在BEGIN过程中不可用。直到首行输入完成以后变量才可用。可以通过-v 参数让awk在执行BEGIN之前得到变量的值。命令行中每一个指定的变量都需要一个-V参数 范例 [rootCentOS8 test]#cat passwd_3.awk #!/bin/awk -f #this is a awk script {if($3min $3max)print $1,$3} [rootCentOS8 test]#./passwd_3.awk -F: min100 max200 /etc/passwd systemd-resolve 193 rtkit 172 pulse 171 qemu 107 usbmuxd 113#省略print $0[rootcentos8 ~]#echo “2008:08:08 08:08:08” | awk ‘{sub(/,“-”,$1);print $0}’ 2008-08:08 08:08:08 ###### **4.3.14.1.2.2 gsub**bash gsub(r,s,[t]) 对t字符串进行搜索r表示的模式匹配的内容并全部替换为s所表示的内容范例 [rootCentOS8 test]#echo 2008:08:08 08:08:08 | awk gsub(/:/,-,$1) 2008-08-08 08:08:08 #省略print $0 [rootCentOS8 test]#echo 2008:08:08 08:08:08 | awk {gsub(/:/,-,$1);print $0} 2008-08-08 08:08:084.3.14.1.2.3 split split(s,array,[r]) 以r为分隔符切割字符串s并将切割后的结果保存至array所表示的数组中第一个索引值为1,第二个索引值为2....范例 [rootCentOS8 test]#netstat -tn Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 96 10.0.0.201:22 10.0.0.1:61841 ESTABLISHED tcp 0 0 10.0.0.201:22 10.0.0.1:61842 ESTABLISHED tcp6 0 0 10.0.0.201:9090 10.0.0.1:63167 TIME_WAIT tcp6 0 0 10.0.0.201:9090 10.0.0.1:63171 ESTABLISHED tcp6 0 0 10.0.0.201:9090 10.0.0.1:63168 TIME_WAIT tcp6 0 0 10.0.0.201:9090 10.0.0.1:63172 ESTABLISHED tcp6 0 0 10.0.0.201:9090 10.0.0.1:63165 ESTABLISHED tcp6 0 0 10.0.0.201:9090 10.0.0.1:63174 ESTABLISHED [rootCentOS8 test]#netstat -tn | awk /tcp/{split($5,ip,:);count[ip[1]]}END{for(i in count){print i,count[i]}} 10.0.0.1 84.3.14.1.2.4 system system 函数 可以awk中调用shell命令空格是awk中的字符串连接符如果system中需要使用awk中的变量可以使用空格分隔或者说除了awk的变量外其他一律用引用起来 例将日志中主机连接数超过1000的ip拉黑 [rootCentOS8 test]#awk {ip[$1]}END{for(i in ip){if(ip[i]1000){system(iptables -A INPUT -s i -j REJECT)}}} file.log#下面是只打印而不拉黑 [rootCentOS8 test]#awk {ip[$1]}END{for(i in ip){if(ip[i]1000){print i,ip[i]}}} file.log4.3.14.2 自定义函数 格式 function name ( parameter, parameter,...){statementsreturn expression }例取2个数中的较大值 [rootCentOS8 test]#cat func_max.awkfunction max(x,y) {xy?varx:varyreturn var } BEGIN{print max(a,b)} [rootCentOS8 test]#awk -v a33 -v b22 -f func_max.awk 334.3.15 awk脚本 将awk程序写成脚本直接调用或执行 例 [rootCentOS8 test]#cat passwd_1.awk {if($31000)print $1,$3}[rootCentOS8 test]#awk -F: -f passwd_1.awk /etc/passwd nobody 65534 joyce 1000 nana 1001 joycee 1002 Tom 1003 Alice 1004#把上面的直接写为脚本 [rootCentOS8 test]#cat passwd_2.awk #!/bin/awk -f #this is a awk script {if($31000)print $1,$3} [rootCentOS8 test]#chmod x passwd_2.awk [rootCentOS8 test]#./passwd_2.awk -F: /etc/passwd nobody 65534 joyce 1000 nana 1001 joycee 1002 Tom 1003 Alice 1004向awk脚本传递参数 格式 awkfile varvalue var2value2... Inputfile注意 在BEGIN过程中不可用。直到首行输入完成以后变量才可用。可以通过-v 参数让awk在执行BEGIN之前得到变量的值。命令行中每一个指定的变量都需要一个-V参数 范例 [rootCentOS8 test]#cat passwd_3.awk #!/bin/awk -f #this is a awk script {if($3min $3max)print $1,$3} [rootCentOS8 test]#./passwd_3.awk -F: min100 max200 /etc/passwd systemd-resolve 193 rtkit 172 pulse 171 qemu 107 usbmuxd 113
http://www.tj-hxxt.cn/news/135782.html

相关文章:

  • 外贸网站 php网站开发私人培训
  • 企业建站公司流程四博互联做的网站
  • 做摄影网站的目的工商企业查询
  • 怎么建视频网站免费的定制家具网
  • 苏州网站制作及推广直接进入qq的网址
  • 网站建设中长出现的问题wordpress 修改文档目录名
  • 网站建设案例精粹 电子书传统文化传播公司网站建设
  • 网站添加悬浮二维码建设网站功能定位
  • 网站域名是什么意思网上申报系统
  • 赤峰建设厅官方网站建设摩托车官网报价及图片
  • 成都企业网站备案流程介绍旅游美食的网站模板免费下载
  • 企业首次建设网站的策划方案企业网站制作官网
  • 做电影网站要买什么吴江网站设计
  • 翻译国外网站做原创jsp 网站建设
  • 洛阳西工区做网站哪家好邯郸信息港首页
  • 工作站做网站互联网内容服务商有哪些
  • 路桥网站制作做家教的正规网站
  • 网站备案查询 优帮云6成都网站建设
  • 郑州小企业网站建设昆明网络推广
  • 单位网站建设的重要性手机端访问 php网站
  • 西城富阳网站建设房地产基础知识300问
  • 哈尔滨网站推广公司网站商城定制网站建设
  • 山东三强建设咨询有限公司网站西城顺德网站建设
  • 给网站做伪静态wordpress upyun
  • 有服务器还需要买网站空间吗南通网站建设总结
  • 网站空间管理地址项目管理咨询公司
  • 网站搭建服务器江苏省建设工程质量监督网站
  • 做个淘宝客网站怎么做的wordpress api 自定义
  • 手机net网站开发专业 网站设计公司
  • 网站建设外包多少钱建网站和建网页的区别