# mount -t iso9660 -o,loop /root/CentOS.iso /mnt
(补充:这里的 CentOS.iso 是指的要挂载的镜像文件的名称,这里的 /mnt 指的是要挂载的目录)
# mount -t iso9660 -o,loop /root/CentOS.iso /mnt
(补充:这里的 CentOS.iso 是指的要挂载的镜像文件的名称,这里的 /mnt 指的是要挂载的目录)
# find <directory> <parameter> <parameter> ...... -print <-exec|-ok> <command|file> {<command>} \;
1) 目录 指需要查找的目录
2) 参数 限制匹配的条件,可以有多个
3) -print 将匹配的结果进行标准输出
4) -exec 让后面的命令执行查找到的内容
5) -ok 和 -exec 的作用相同,只不过每执行一步就需要用户确认一下
6) command 对匹配的结果执行命令
7) file 对匹配的结果进行文件种类分析,后面的 {} 里的命令必须为空
8) 命令 对匹配结果要执行的命令
(注意:<-exec|-ok> {} \;,这是一个固定格式,谁也不能被缺少。并且 {<命令>} 和 \ 之间有一个空格)
9) -xdev 不显示警告,只显示查找到的内容,这样显示起来简单美观
1) -name n 名称是 n 的文件或目录
2) -iname n 名称是 n 的文件或目录,并且忽略大小写
3) -lname n 名称是 n 的链接
(注意:在 3) 参数中,n 是被链接文件的名称而不是链接文件本身的名称)
-type n :文件类型是 n 的文件
(补充:这里的 n 可以是 d、f、l,它们分别代表目录、文件、链接)
1) -uid n 所属 gid 是 n 的文件或目录
2) -user n 所属主名称为 n 的文件或目录
3) -gid n 所属 gid 是 n 的文件或目录
4) -group n 所属组名称为 n 的文件或目录
5) -nouser 匹配无所属主的文件或目录
6) -nogroup 匹配无所属组的文件或目录
1) -perm /u=n 所属主权限是 n 的文件或目录
2) -perm /u=n 所属组权限是 n 的文件或目录
3) -perm /o=n 所其他的权限是 n 的文件或目录
(补充:在以上 1) 到 3) 参数中 n 可以是 r、w、x 它们分别代表读权限、写权限、执行权限)
4) -perm -n 所属主、所属组、其他的权限是 n 的文件或目录
(补充:在 (4 参数中 n 是可以是 1、2、4)
5) -perm nnn 权限是 nnn 的文件或目录
(
补充:
在 5) 参数中:
n 是数字
第一个 n 是特殊权限
第二个 n 是所属主的权限
第三个 n 是所属组的权限
第四个 n 是其他的权限
例:600
)
6) -perm nnnn 权限是 nnnn 的文件或目录
(
补充:
在 6) 参数中:
n 是数字
第一个 n 是特殊权限
第二个 n 是所属主的权限
第三个 n 是所属组的权限
第四个 n 是其他的权限
例:0600
)
1) -amin n 在过去 n 分钟被读取过的文件或目录
2) -anewer file 比文件 file 更晚被读取过的文件或目录
3) -atime n 在过去 n 天被读取过的文件或目录
4) -mmin n 在过去 n 分钟被修改过内容的文件或目录
5) -mnewer file 比文件 file 更晚被修改过内容的文件或目录
6) -mtime n 在过去 n 天被修改过内容的文件或目录
7) -cmin n 在过去 n 分钟被修改过属性(比如新建)的文件或目录
8) -cnewer file 比文件 file 更晚被修改过属性(比如新建)的文件或目录
9) -ctime n 在过去 n 天被修改过属性(比如新建)的文件或目录
(补充:在以上 1) 到 9) 参数中 n 是数字, +n 表示 n 以前,-n 表示 n 以后,n 表示第 n)
1) -empty 为空的文件或目录
2) -size n 文件大小是 n 的文件或目录
(补充:在 2) 参数中 n 是数字, +n 表示比 n 大,-n 表示比 n 小,单位有 b、m、g 等)
1) -path ‘n’ 路径名称符合 n 的文件或目录
2) -ipath ‘n’ 路径名称符合 n 的文件或目录,并且忽略大小写
3) -depth n 路径深度为 n 的文件或目录
4) -maxdepth n 最大路劲深度为 n 的文件或目录
(补充:在以上 1) 到 4) 参数中 n 是数字)
1) -fstype n 匹配硬盘格式为 n 文件或目录
(补充:1) 参数中 n 可以是 ext3、ext4、xfs 等硬盘格式)
2) -mount 是被挂载的文件或目录
1) -not 不匹配后面的参数,需要放在其他参数前面
2) ! 不匹配后面的参数,需要放在其他参数前面
3) -a 和,需要放在两个参数之前
4) -and 和,需要放在两个参数之前
5) -o 或,需要放在两个参数之前
6) -or 或,需要放在两个参数之前
7) <parameter> ( <parameter> n <parameter> ) 指定将某两个参数作为一个整体和另一个逻辑参数进行匹配
8) <parameter> -prune -n <parameter> <parameter> 指定某两个参数进行逻辑匹配
(补充:在以上 7) 到 8) 参数中 n 可以是 -a、-and、-o、-or 以上 3) 到 6) 参数)
# find . -name "*\.txt"
# find . -name "*\.txt" -not -name "test1.txt" -not -name "test2.txt"
# find /var/log -type f -not -name "wtmp" -not -name "btmp" -not -name "lastlog" -exec chmod o-rwx {} +
或者:
# find /var/log -type f -not -name "wtmp" -not -name "btmp" -not -name "lastlog" -exec chmod o-rwx {} \;
# find . -type d
# find /tmp/ -maxdepth 1 -type d -exec cp -p -f ./.htaccess.orig '{}'/.htaccess +
或者:
# find /tmp/ -maxdepth 1 -type d -exec cp -p -f ./.htaccess.orig '{}'/.htaccess \;
# find . -user root
# find . -nouser -o -nogroup
# find / -user natasha -exec cp -rp {} /root/findfiles/ +
或者:
# find / -user natasha -exec cp -rp {} /root/findfiles/ \;
# find . -type f -perm 0777 -exec ls -l {}+
或者:
# find . -type f -perm 0777 -exec ls -l {}\;
# find . -type f -perm -2
# find . -perm /a=x
# /usr/bin/find . -type f -perm /o=w -exec chmod o-w {} +
或者:
# /usr/bin/find . -type f -perm /o=w -exec chmod o-w {} \;
# find / -type f \( -perm -1000 -o -perm -2000 -o -perm -4000 \) -print
# find . -ctime -10
# find /var/log/mysql -type f -mtime +3 -ok rm {}+
或者:
# find /var/log/mysql -type f -mtime +3 -ok rm {}\;
(注意:此方法会出现交互界面,需要在交互界面确认以后才会对找到的文件进行操作)
# find . -type f -size 0 -exec ls -l {} +
或者:
# find . -type f -size 0 -exec ls -l {} \;
# find . -type f -empty
在 / 目录和 /proc/ 目录查找文件格式为 ext3 无所属主或所属组的文件和目录
# find / -path '/proc/*' -prune -o -fstype ext3 -nouser -o -nogroup
在 \ 目录查找以
# find . -type f
# find . -type f \( -name "*.txt" -or -name "*.dox" \)
# find . -type f ! -perm 777
# find . -type f \( -perm -2000 -o -perm -4000 \) -exec file {} +
或者:
# find . -type f \( -perm -2000 -o -perm -4000 \) -exec file {} \;
# find / -nouser -o -nogroup
1) 从第 1 行开始 1 行 1 行地读取文件里的内容
2) 每读取 1 行就将内容存入到 pattern space (模型空间) 里面,pattern space (模型空间) 里的内容默认会自动显示出来
3) 在 pattern space (模型空间) 中执行 sed 命令
4) 再显示 pattern space (模型空间) 中的内容然后将其清空
5) 之后重复以上操作再开始读取文件里的下 1 行
6) pattern space (模型空间) 里的内容可以存储到 hold space 里面
# sed <option> <parameter> <file>
1) -n 或 –quiet 或 –silent 仅显示处理后的内容,没处理的内容就不显示了,也就是仅显示非标准输出的内容
2) -i 实现数据的变更
3) -e <script> 或 –expression=<script> 这样可以一次匹配多个参数
4) -r 支持扩展正则
5) -f <script file> 或 –file=<script file> 以指定的脚本文件来处理输入的文件
6) -h 或 –help 显示帮助内容
7) -V 或 –version 显示版本信息
(
补充:
1) pattern space (模型空间) 相当于处理内容的流水线
2) hold space (保持空间) 相当于暂时存储内容的仓库
)
1) p 先将每行的内容以标准输出的形式显示 1 遍,再将每行的内容以非标准输出的形式再显示 1 遍。不改变是否跳过下 1 行的属性,也就是如果前面有一个 N 参数,则跳过往下第 1 行接着执行往下第 2 行,如果前面没有任何参数,则直接执行往下第 1 行
2) P 先将每行的内容以非标准输出的形式再显示 1 遍,但是如果是 2 行组合在一起的话只显示第 1 行的内容,也就是只显示分行符 “/n” 之前的内容,再将每行的内容以标准输出的形式显示 1 遍。不改变是否跳过下 1 行的属性,也就是如果前面有一个 N 参数,则跳过往下第 1 行接着执行往下第 2 行,如果前面没有任何参数,则直接执行往下第 1 行
3) n 将每行的内容以标准输出的形式显示 1 遍,并提前读取下 1 行的内容,将下 1 行的内容覆盖当前行的 pattern space (模型空间),也就是下 1 行变成了当前行,再将当前行的内容以标准输出的形式显示一遍 (如果此时得到的内容是非标准的形式则不显示)。然后跳过往下第 1 行接着执行往下第 2 行。另外,如果往下 1 行不存在则直接停止所有命令,如果当前面的条件匹配时则放弃所有后面的命令
4) N 提前预读下 1 行,将下 1 行的内容添加到本行的 pattern space (模型空间) 后面,但是本行的内容和下 1 行的内容之间依旧存在分行符 “/n”,再将当前行的内容以标准输出的形式显示一遍。然后跳过下第 1 行接着执行往下第 2 行。另外,如果下 1 行不存在则以标准的形式显示当前 pattern space (模型空间) 里的内容并直接停止所有命令,如果当前面的条件不匹配时则放弃执行 N 命令直接执行后面的命令
5) = 以非标准输出的形式显示每 1 行是第几行,在行数后面以标准输出的形式显示行的内容
6) a 在某 1 行后面添加 1 行的内容
7) i 在某 1 行前面插入 1 行的内容
8) c 替换某 1 行的内容
9) g 将 hold space (保持空间) 中的内容拷贝到 pattern space (模型空间) 中,原来 pattern space (模型空间) 里的内容被清除
10) G 将 hold space (保持空间) 中的内容 append (添加) 到 pattern space (模型空间) 分行符 “/n” 后
11) h 将 pattern space (模型空间) 中的内容拷贝到 hold space (保持空间) 中,原来的 hold space (保持空间)里的内容被清除
12) H 将 pattern space (模型空间) 中的内容 append (添加) 到 hold space (保持空间) 分行符 “/n” 后
13) d 删除 pattern space (模型空间) 中的所有行,并执行下 1 行
14) D 删除 pattern space (模型空间) 中的第 1 行,也就是分行符 “/n” 之前的内容,如果删除后还有内容,则以此内容作为新的 1 行往下执行
15) s 替换某行的某些内容
16) y 替换某行的某些内容,和 s 的作用一样,但是功能没有 s 丰富
17) x 将当前 hold space (保持空间) 和 pattern space (模型空间) 内容互换,hold space (保持空间) 用来保存临时内容, pattern space (模型空间) 是本行的内容,注意 hold space (保持空间) 和 pattern space (模型空间) 的内容互换并不改变这些内容是第几行的,例如在 pattern space (模型空间) 里的内容是第 3 行的,则需要 3p
18) r 读取某一个文件里的内容
19) w 将内容写入一个文件
20) q 退出,前面可以跟退出的条件,后面可以跟退出代码
21) b 参数,设置标签分支,如果条件不成立,则对标签的位置进行跳转,如果标签省略了,则分支会一直到末尾
22) t 参数,设置标签分支,如果条件成立,则对标签的位置进行循环跳转,直到所有可进行的操作都完成后才停止,如果标签省略了则标签分支会一直到头部。在 t 和变迁之间的步骤是会循环执行的区域
(
注意:
1) 当多个参数进行组合时,多次标准输出最后会合并成只显示 1 次
2) 当多个参数进行组合时,当 1 个参数后面还有参数时,产生的输出不会直接显示而是传输给下 1 个参数进行处理,如果此次显示是非输出的形式,传递给下 1 个参数处理以后也会以非输出的形式输出
)
# sed -n 2p test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed -n 2,4p test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed 1!p test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed -n '$p' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
或者:
# sed 'N;D' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed -n '/eternalcenter/p' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed -n '/eternalcenter$/p' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed -n -e '/eternalcenter/{=;x;1!p;g;$!N;p;D;}' -e h test.txt
(
补充:
1) 当执行到包含 eternalcenter 内容的行时
2) 执行 /eternalcenter/ 判断当前包含 eternalcenter 内容则为真,如果为真,执行 = 参数,以非标准输出的形式传输每 1 行是第几行,在行数后面以标准输出的形式传输行的内容,此时这些内容存放在 pattern space (模型空间) 中并传输给 x 参数
3) 执行 x 参数,将当前 hold space (保持空间) 和 pattern space (模型空间) 内容互换,并传输给 p 参数。在执行 x 参数前 hold space (保持空间) 里的内容是由上一行执行 h 参数时保存的,所以执行 x 参数后 pattern space (模型空间) 的内容是上一行的内容。注意 hold space (保持空间) 和 pattern space (模型空间) 的内容互换并不改变这些内容是第几行的
4) 执行 1! 判断当前行不是第 1 行则为真,如果不是第 1 行,如果执行 p 参数,将此时 pattern space (模型空间) 的内容以标准输出的形式进行显示,再将 pattern space (模型空间) 的内容以非标准输出的形式传输给 g 参数
5) 执行 g 参数,将 hold space (保持空间) 中的内容拷贝到 pattern space (模型空间) 中,原来 pattern space (模型空间) 里的内容被清除,将此时的 pattern space (模型空间) 的内容传输给 N 参数
6) 执行 $! 判断当前行不是最后 1 行则为真,如果为真,执行 N 参数,将下一行的内容添加到本行内容的后面,但是两行之间存在分行符 “/n”,保存到 pattern space (模型空间),将此时的 pattern space (模型空间) 的内容以非标准输出的形式传输给 p 参数
7) 执行 p 参数,将 pattern space (模型空间) 里的内容以标准的形式显示,再将 pattern space (模型空间) 里的内容以非标准的形式传输给 D 参数
8) 执行 D 参数,删除 pattern space (模型空间) 中的第 1 行,也就是分行符 “/n” 之前的内容,并将此时 pattern space (模型空间) 里的内容传输给参数 h
9) 执行 h 参数,将 pattern space (模型空间) 中的内容拷贝到 hold space (保持空间) 中,原来的 hold space (保持空间)里的内容被清除
10) 这里的 test.txt 是要被 sed 操作的测试文件
)
# sed -n '/2000/,/2007/p' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
(注意:test.txt 里必须要有包含 2000 内容和 2007 内容的行此命令才会生效)
# sed -n '/2022-01-01 00:00:00/,/2022-02-22 00:00:00/p' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
(注意:test.txt 里必须要有包含 2022-01-01 00:00:00 内容和 2022-02-22 00:00:00 内容的行此命令才会生效)
# sed '/2019-01-01/,$' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
(注意:test.txt 里必须要有包含 2019-01-01 内容的行此命令才会生效)
# sed -n $= test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed -n '{=;1!p}' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed -n '{=;2!p}' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed = test.txt | sed 'N;s/\n/:/'
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed -n 'p;n' test.txt
(
补充:
1) 执行第 1 行,执行 p 参数,将第 1 行的内容以标准输出的形式进行显示,再将第 1 行的内容以非标准输出的形式传输给 n 参数,再执行 n 参数,将第 1 行的内容以标准输出的形式进行显示 (但是这里传输给 n 参数的内容已经是非标准的形式了,所以这里变为以非标准的形式进行显示),再将第 1 行的内容被第 2 行的内容覆盖,再将第 1 行的内容以标准输出的形式显示 1 遍 (但是这里传输给 n 参数的内容已经是非标准的形式了,所以这里不再进行显示),再跳过第 2 行再直接执行第 3 行。前面以标准输出的形式显示的内容被 -n 选项屏蔽
2) 执行第 3 行,执行 p 参数,将第 3 行的内容以标准输出的形式进行显示,再将第 3 行的内容以非标准输出的形式传输给 n 参数,再执行 n 参数,将第 3 行的内容以标准输出的形式进行显示 (但是这里传输给 n 参数的内容已经是非标准的形式了,所以这里变为以非标准的形式进行显示),再将第 3 行的内容被第 4 行的内容覆盖,再将第 1 行的内容以标准输出的形式显示 1 遍 (但是这里传输给 n 参数的内容已经是非标准的形式了,所以这里不再进行显示),再跳过第 4 行再直接执行第 5 行。前面以标准输出的形式显示的内容被 -n 选项屏蔽
3) 以此类推
4) 当执行到最后 1 行时,按照之前的逻辑,如果是奇数行则显示当前行的内容,如果是偶数行则跳过
5) 这里的 test.txt 是要被 sed 操作的测试文件
)
或者:
# sed -n '$!N;P' test.txt
(
补充:
1) $! 作用是判断当前行不是最后 1 行时执行后面的命令
2) 执行第 1 行,执行 $! 判断当前行不是最后 1 行则为真,第 1 行不是最后 1 行,执行 N 命令,将第 2 行的内容添加到第 1 行的内容的后面,但是第 1 行和第 2 行之间存在分行符 “/n”,再将当前行的内容以标准输出的形式传输给 P 参数,再执行 P 命令,将此时第 1 行的内容以标准输出的形式进行显示,再将分行符 “/n” 之前的所有内容 (也就是最早是第 1 行的内容) 以非标准输出的形式显示出来,并跳过第 2 行再直接执行第 3 行。前面以标准输出的形式显示的内容被 -n 选项屏蔽
3) 执行第 3 行,执行 $! 判断当前行不是最后 3 行则为真,第 3 行不是最后 1 行,执行 N 命令,将第 4 行的内容添加到第 3 行的内容的后面,但是第 3 行和第 4 行之间存在分行符 “/n”,再将当前行的内容以标准输出的形式传输给 P 参数,再执行 P 命令,将此时第 3 行的内容以标准输出的形式进行显示,再将分行符 “/n” 之前的所有内容 (也就是最早是第 3 行的内容) 以非标准输出的形式显示出来,并跳过第 3 行再直接执行第 4 行。前面以标准输出的形式显示的内容被 -n 选项屏蔽
4) 以此类推
5) 当执行到最后 1 行时,因为已经没有下 1 行了,所以停止命令
6) 这里的 test.txt 是要被 sed 操作的测试文件
)
或者:
# sed 'n;d' test.txt
(
补充:
1) 执行第 1 行,执行 n 参数,将第 1 行的内容以标准输出的形式进行显示,再将第 1 行的内容被第 2 行的内容替代,再将被替代的内容传输给 d 参数,再执行 d 参数将第 2 行的内容删除掉。并跳过第 2 行直接执行第 3 行
2) 执行第 3 行,执行 n 参数,将第 3 行的内容以标准输出的形式进行显示,再将第 3 行的内容被第 4 行的内容替代,再将被替代的内容传输给 d 参数,再执行 d 参数将第 4 行的内容删除掉。并跳过第 4 行直接执行第 5 行
3) 以此类推
4) 当执行到最后 1 行时,因为已经没有下 1 行了,所以停止命令
5) 这里的 test.txt 是要被 sed 操作的测试文件
)
# sed -n 'n;p' test.txt
(
补充:
1) 执行第 1 行,执行 n 参数,将第 1 行的内容以标准输出的形式进行显示,再将第 1 行的内容被第 2 行的内容替代,再将被替代的内容传输给 p 参数,再执行 p 参数,将第 2 行的内容以标准的形式显示,再将第 2 行的内容以非标准的形式显示。并跳过第 2 行再直接执行第 3 行。前面以标准输出的形式显示的内容被 -n 选项屏蔽
2) 执行第 3 行,执行 n 参数,将第 3 行的内容以标准输出的形式进行显示,再将第 3 行的内容被第 4 行的内容替代,再将被替代的内容传输给 p 参数,再执行 p 参数,将第 4 行的内容以标准的形式显示,再将第 4 行的内容以非标准的形式显示。并跳过第 4 行再直接执行第 5 行。前面以标准输出的形式显示的内容被 -n 选项屏蔽
3) 以此类推
4) 当执行到最后 1 行时,因为已经没有下 1 行了,所以停止命令
5) 这里的 test.txt 是要被 sed 操作的测试文件
)
# sed = test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed -n test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed -n '/eternalcenter/=' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed -n '/^$/=' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sort test.txt | sed '$!N;/^\(.*\)\n\1$/!P;D'
(
补充:
1) 执行 sort 将所有的行进行排序将相同的行排在一起,并结果输出给 sed
2) 执行第 1 行,执行 $! 判断当前行不是最后 1 行则为真,第 1 行不是最后 1 行,执行 N 参数,将第 2 行的内容添加到第 1 行的内容的后面,但是第 1 行和第 2 行之间存在分行符 “/n”,再将组合后的内容传输给 P 参数,再执行 /^(.*)\n\1$/! 判断当前行 \n 前面和后面不一样则为真,当为假时则直接不执行将内容传输给 D 参数,当为真时,执行 P 参数,先将第 1 行的内容以非标准输出的形式显示一遍,但是如果是 2 行组合在一起的话只显示第 1 行的内容,也就是只显示分行符 “/n” 之前的内容,再将第 1 行的内容以标准输出的形式传输给 D 参数,执行 D 参数,删除内容中的第 1 行,也就是分行符 “/n” 之前的内容,如果删除后还有内容,则以此内容作为新的 1 行往下执行第 2 行,如果删除后没有内容了,则跳过第 2 行直接执行第 3 行
3) 以此类推
4) 当执行到最后 1 行时,因为已经没有下 1 行了,所以停止命令
5) 这里的 test.txt 是要被 sed 操作的测试文件
)
# sed "2a eternalcenter" test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed "/abc/a eternalcenter" test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed "/^a/a eternalcenter" test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed "/^\[a\]/a eternalcenter" test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed "$a eternalcenter" test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed '/eternalcenter/a eternalcentre\nmingyuzhu\nzhumingyu' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed "2i eternalcenter" test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed "/abc/i eternalcenter" test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed "/^a/i eternalcenter" test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed "/^\[a\]/i eternalcenter" test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed "$a eternalcenter" test.txt
或者:
# sed "/$/a eternalcenter" test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed "2c\ eternalcenter" test.txt
或者:
# sed "2ceternalcenter" test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed "/abc/c\ eternalcenter" test.txt
或者:
# sed "/abc/ceternalcenter" test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed "/^a/c\ eternalcenter" test.txt
或者:
# sed "/^a/ceternalcenter" test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed "/^\[a\]/c\ eternalcenter" test.txt
或者:
# sed "/^\[a\]/ceternalcenter" test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed "/^eternalcentre/c\ eternalcenter\ ALL=\(ALL\)\ NOPASSWD:\ ALL" test.txt
或者:
# sed "/^eternalcentre/c\eternalcenter\ ALL=\(ALL\)\ NOPASSWD:\ ALL" test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed 2d test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed /"abc"/d test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed /"^a"/d test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed /"^\[a\]"/d test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed '/^#/d' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed '2,4d' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed 's/eternalcentre/eternalcneter/' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed 's/eternalcentre/eternalcneter/g' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed 's/.*eternalcentre.*/eternalcneter/' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed '3s/eternalcentre/eternalcenter/2' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed 's/^/eternalcenter/g' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
或者:
# sed 's/^/eternalcenter&/g test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed 's/$/eternalcenter/g' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
或者:
# s/$/&eternalcenter/g' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed '2s/.*/eternalcenter/' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed '$s/.*/eternalcenter/' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed '2,3s/.*/eternalcenter/' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed "s/^\(.*\)\(eternalcenter\)\(.*\)$/\3\2\1/" test.txt
或者:
# sed -r "s/(.*)(eternalcenter)(.*)/\3\2\1/" test.txt
或者:
# sed -r "s/(.*)((eternal)(center))(.*)/\5\2\1/" test.txt
(补充:这里以 (.*) 是 1,((eternal)(center)) 是 2,(eternal) 是 3,(center) 是 4,(.*) 是 5 为例,这里的 test.txt 是要被 sed 操作的测试文件)
# sed -r 's/.*/&\n/g;:a;s/(.*)(.)\n(.*)/\1\n\3\2/g;ta;s/^\n//g' test.txt
(
补充:
1) 执行 s/.*/&\n/g 在每行行尾添加换行符 “\n”
2) 执行 a 参数和 ta 参数,将从 :a 到 ta 之间的内容以后面的操作作为循环条件只要还能继续执行就一直循环,每次执行 s/(.*)(.)\n(.*)/\1\n\3\2/g,将此时所有行换行符 “\n” 之前的内容里最后一个字母移动到所有行换行符 “\n” 之后到内容里最后一个位置
3) 执行 s/^\n//g 删除所有行的换行符 “\n”
4) 这里的 test.txt 是要被 sed 操作的测试文件
)
或者:
# sed -r 's/.*/&\n/g;:b;s/(.*)(.)\n(.*)/\1\n\3\2/g;tb;s/^\n//g' test.txt
(
补充:
1) 执行 s/.*/&\n/g 在每行行尾添加换行符 “\n”
2) 执行 b 参数和 tb 参数,将从 :b 到 tb 之间的内容以后面的操作作为循环条件只要还能继续执行就一直循环,每次执行 s/(.*)(.)\n(.*)/\1\n\3\2/g,将此时所有行换行符 “\n” 之前的内容里最后一个字母移动到所有行换行符 “\n” 之后到内容里最后一个位置
3) 执行 s/^\n//g 删除所有行的换行符 “\n”
4) 这里的 test.txt 是要被 sed 操作的测试文件
)
# sed 's/.//1;s/.$//' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed 's/.//2;s/.$//' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed -r 's/[0-9]//g;s/^( )+//g' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed '/eternalcenter/N;s/.*\n//' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed 's/[A-Z]/(&)/g' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed '7,9s/^/#/' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed -r 's/( )(.*)/\2/'
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed -r 's/^([A-Z]{1,})([a-z]{1,})([0-9]{1,})$/\1\2ok\3/' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed -r 's/^([A-Z]{1,})([a-z]{1,})([0-9]{1,})$/\3 ok \1\2/' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed -r 's/([0-9]{1,})\-([0-9]{1,})\-([0-9]{1,})/\1\2\3/' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# echo 20220222 | sed -r 's/(....)(..)(..)/\1 \2 \3/'
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed '$!N;s/\n/ /' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed '/\\$/N;s/\\\n/ /' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed -e :a -e '/\\$/N;s/\\\n/ /; ta' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D' num.txt
(
补充:
1) 执行 :a 参数和 ta 参数,将从 :a 到 ta 之间的内容以后面的操作作为循环条件只要还能继续执行就一直循环,每次执行 $!N;s/\n=/ /,当不是最后 1 行时,将下 1 行的内容添加到本行后面,但是本行的内容和下 1 行的内容之间依旧存在分行符 “/n”,如果此时存在 \n=,则将其替换成空格,再将最后的结果以非标准输出的方式传输给 P 参数,执行 P 参数,将分行符 “/n” 之前的所有内容 (也就是最初此行的内容) 以非标准输出的形式显示,再将此时的所有内容以非标准输出的形式传输给 D 参数,执行 D 参数,删除前 1 行,也就是分行符 “/n” 之前的内容,如果删除后还有内容,则以此内容作为新的 1 行往下执行,否则跳过往下第 1 行接着执行往下第 2 行
2) 以此类推
3) 执行 s/^\n//g 删除所有行的换行符 “\n”
4) 这里的 test.txt 是要被 sed 操作的测试文件
)
# awk '{for(i=1;i<=NF;i++){if(i in arr){arr[i]=arr[i]" "$i}else{arr[i]=$i}}}END{for(i=1;i<=NF;i++){print arr[i]}}' test.txt | sort | sed -e :a -e '$!N;/^\(.....\).*\n\1.*/s/^\(.*\)\(\n\)\(.....\)\(.*\)/\1\4/g; ta'
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
# awk '{for(i=1;i<=NF;i++){if(i in arr){arr[i]=arr[i]" "$i}else{arr[i]=$i}}}END{for(i=1;i<=NF;i++){print arr[i]}}' test.txt | sort | sed -e :a -e '$!N;/^\(.*\.com\).*\n\1.*/s/^\(.*\)\(\n\)\(.*\.com\)\(.*\)/\1\4/g; ta'
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
# > awk '{for(i=1;i<=NF;i++){if(i in arr){arr[i]=arr[i]" "$i}else{arr[i]=$i}}}END{for(i=1;i<=NF;i++){print arr[i]}}' test.txt | sort | sed -e :a -e '$!N;/^\(.*\ \).*\n\1.*/s/^\(.*\)\(\n\)\(.*\ \)\(.*\)/\1 \4/g; ta'
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
1) 从第 1 行开始 1 行 1 行地读取文件里的内容
2) 每读取 1 行就将内容存入到 pattern space (模型空间) 里面,pattern space (模型空间) 里的内容默认会自动显示出来
3) 在 pattern space (模型空间) 中执行 sed 命令
4) 再显示 pattern space (模型空间) 中的内容然后将其清空
5) 之后重复以上操作再开始读取文件里的下 1 行
6) pattern space (模型空间) 里的内容可以存储到 hold space (保持空间) 里面
(
补充:
1) pattern space (模型空间) 相当于处理内容的流水线
2) hold space (保持空间) 相当于暂时存储内容的仓库
)
1) g 将 hold space (保持空间) 中的内容拷贝到 pattern space (模型空间) 中,原来 pattern space (模型空间) 里的内容被清除
2) G 将 hold space (保持空间) 中的内容 append (添加) 到 pattern space (模型空间) 分行符 “/n” 后
3) h 将 pattern space (模型空间) 中的内容拷贝到 hold space (保持空间) 中,原来的 hold space (保持空间)里的内容被清除
4) H 将 pattern space (模型空间) 中的内容 append (添加) 到 hold space (保持空间) 分行符 “/n” 后
5) d 删除 pattern space (模型空间) 中的所有行,并执行下 1 行
6) D 删除 pattern space (模型空间) 中的第 1 行,也就是分行符 “/n” 之前的内容,如果删除后还有内容,则以此内容作为新的 1 行往下执行
P H P H P H
1 h 1 1 d 1
P H P H P H P H
2 1 G 2 1 H 2 1 d 1
1 1 2 2
1 1
P H P H P H
3 2 G 3 2 h 3 3
1 2 1 2 2
1 1 1
P H P H
3 2 g 2 2
1 1 1
(
补充:
1) 这里的 P 指的是 pattern space (模型空间)
2) 这里的 H 指的是 hold space (保持空间)
3) h 其实就是清空现在粘贴板里的内容然后重新复制
4) H 其实就是不清空现在粘贴板里的内容然后再再原来粘贴版的内容基础上再添加复制
5) g 其实就是替换粘贴
6) G 其实就是添加粘贴
)
# sed -e '1h' -e '3G' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed -e '1h' -e '3g' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed -e '1h' -e '2H' -e '3G' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed -e '1h' -e '2H' -e '3g' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed -e '/^a/h' -e '3G' 1.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed -e '/^a/h' -e'/^a/H' -e '3G' 1.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# echo "eternalcenter" | sed -r 'H;s/(.{7}).*/\1/;x;s/.*(.{6})$/\1/;x;G;s/\n/ /'
(
1) 执行 H 参数,将 pattern space (模型空间) 中的内容 append (添加) 到 hold space (保持空间) 分行符 “/n” 后,并将此时的 pattern space (模型空间) 传输给 s 参数
2) 执行 s/(.{7})./\1/,将 pattern space (模型空间) 中的内容只保留前 7 个字符,并将此时的 pattern space (模型空间) 传输给 x 参数 3) 执行 x 参数,将 hold space (保持空间) 和 pattern space (模型空间) 内容互换,,并将此时的 pattern space (模型空间) 传输给 s 参数 4) 执行 s/.(.{6})$/\1/,将 pattern space (模型空间) 中的内容只保留后 6 个字符,并将此时的 pattern space (模型空间) 传输给 x 参数
5) 执行 x 参数,将 hold space (保持空间) 和 pattern space (模型空间) 内容互换,,并将此时的 pattern space (模型空间) 传输给 G 参数
6) 执行 G 参数,将 hold space (保持空间) 中的内容 append (添加) 到 pattern space (模型空间) 分行符 “/n” 后,并将此时的 pattern space (模型空间) 传输给 s 参数
7) 执行 s/(.{7}).*/\1/,将 pattern space (模型空间) 中的内容删除换行符 “\n”
)
# 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")}'
(
补充:
1) 执行 seq 9 命令,第 1 行输出 1,第 2 行输出 2,以此类推直到第 9 行,并将结果传输给 sed 命令
2) 执行 sed 的 H 参数,将 pattern space (模型空间) 中的内容 append (添加) 到 hold space (保持空间) 分行符 “/n” 后,并将此时的 pattern space (模型空间) 传输给 g 参数。当执行到第 1 行时,添加到 hold space (保持空间) 是 1,hold space (保持空间) 里的值是 \n1,当时执行到第 2 行时,添加到 hold space (保持空间) 是 2,hold space (保持空间) 里的值是 \n1\n2,依次类推
3) 执行 sed 的 g 参数,将 hold space (保持空间) 中的内容拷贝到 pattern space (模型空间) 中,原来 pattern space (模型空间) 里的内容被清除。当执行到第 1 行时,hold space (保持空间)里的值是 \n1,pattern space (模型空间) 里的值将是 \n1,显示的结果也会是 1,当执行到第 2 行时,hold space (保持空间)里的值是 \n1\n2,pattern space (模型空间) 里的值将是 \n1\n2,显示的结果也会是 \n1\n2,依次类推,并将结果传输给命令 awk
3) awk,将多行视为 1 行,会执行从 1 到此行列数次循环,变量 i 初始时的值为 1,每执行 1 次则变量 i 到值会加 1,每次循环时会显示:“此时变量 i 的值”*“此行的列数”=“此时变量 i 的值和此行的列数的乘积““当此时变量 i 的值等于此行的列数时则换行,否则的话则显示制表符的空格长度”。当执行到第 1 行时显示的是 1×1=1,当执行到第 2 行时显示的是 1×2=2 2×2=4,以此类推
)
在 abc 和 bbb 那两行后面添加 1 行 eternalcenter
# sed -e "/abc/a eternalcenter" -e "/^bbb/a eternalcenter" test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed '3r test2.txt' test1.txt
(补充:这里的 test1.txt 和 test2.txt 是要被 sed 操作的测试文件)
# sed '3w test2.txt' test1.txt
(补充:这里的 test1.txt 和 test2.txt 是要被 sed 操作的测试文件)
# sed '5 q' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed '/eternalcenter/ q' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed '3 q 3' test.txt
(补充:这里的 test.txt 是要被 sed 操作的测试文件)
# sed '{/eternalcenter/b lable;s/0/1/;:lable}' test.txt
(
补充:
1) 在这里 lable 是标签
2) 这里的 test.txt 是要被 sed 操作的测试文件
)
或者:
# sed '/eternalcenter/ba;s/0/1/;b;:a' test.txt
(
补充:
1) 在这里 a 是标签
2) 这里的 test.txt 是要被 sed 操作的测试文件
)
# sed '/eternalcenter/s/0/1/;t;s/0/2/' test.txt
(
补充:
1) 在这里的标签省略了,所以标签分支会一直到头部
2) 这里的 test.txt 是要被 sed 操作的测试文件
)
或者:
# sed -e :a -e '/eternalcenter/s/0/1/;ta;s/0/2/' test.txt
(
补充:
1) 在这里 a 是标签
2) 这里的 test.txt 是要被 sed 操作的测试文件
)
# grep -P '^root' /etc/passwd
或者:
# grep --perl-regexp '^root' /etc/passwd
(补充:这里以匹配 /etc/passwd 文件中开头为 root 的行为例)
# grep -e '^root' /etc/passwd
或者:
# grep --regexp=PATTERN '^root' /etc/passwd
(补充:这里以匹配 /etc/passwd 文件中开头为 root 的行为例)
# grep -E '([1-9][0-9]{0,2}\.){3}[1-9][0-9]{0,2}' /etc/sysconfig/network-scripts/ifcfg-ens192
或者:
# grep --extended-regexp '([1-9][0-9]{0,2}\.){3}[1-9][0-9]{0,2}' /etc/sysconfig/network-scripts/ifcfg-ens192
或者:
# egrep '([1-9][0-9]{0,2}\.){3}[1-9][0-9]{0,2}' /etc/sysconfig/network-scripts/ifcfg-ens192
(补充:这里以匹配 /etc/sysconfig/network-scripts/ifcfg-ens192 文件里含有 IP 地址的行为例)
# egrep -n '([1-9][0-9]{0,2}\.){3}[1-9][0-9]{0,2}' /etc/sysconfig/network-scripts/ifcfg-ens192
或者:
# egrep --line-number '([1-9][0-9]{0,2}\.){3}[1-9][0-9]{0,2}' /etc/sysconfig/network-scripts/ifcfg-ens192
或者:
# egrep --line-buffered '([1-9][0-9]{0,2}\.){3}[1-9][0-9]{0,2}' /etc/sysconfig/network-scripts/ifcfg-ens192
(补充:这里以匹配 /etc/sysconfig/network-scripts/ifcfg-ens192 文件里含有 IP 地址的行并显示行号为例)
# egrep -n ^$ /etc/resolv.conf
或者:
# egrep --line-number ^$ /etc/resolv.conf
或者:
# egrep --line-buffered ^$ /etc/resolv.conf
(补充:这里以匹配 /etc/resolv.conf 里的空行并显示行号为例)
# egrep -v '([1-9][0-9]{0,2}\.){3}[1-9][0-9]{0,2}' /etc/sysconfig/network-scripts/ifcfg-ens192
或者:
# egrep --invert-match '([1-9][0-9]{0,2}\.){3}[1-9][0-9]{0,2}' /etc/sysconfig/network-scripts/ifcfg-ens192
(补充:这里以匹配 /etc/sysconfig/network-scripts/ifcfg-ens192 文件里不含有 IP 地址的行并显示行号为例)
# egrep -v ^$ /etc/resolve.conf
或者:
# egrep --invert-match ^$ /etc/resolve.conf
(补充:这里以匹配 /etc/resolve.conf 文件里不为空的行为例)
# grep '^[^#]' /etc/resolve.conf
(补充:这里以匹配 /etc/resolve.conf 文件里不以井号 “#” 开头的行为例)
# grep '^[^#| ]' /etc/resolve.conf
(补充:这里以匹配 /etc/resolve.conf 文件里不以井号 “#” 和空格 “ ” 开头的行为例)
# egrep -o '([1-9][0-9]{0,2}\.){3}[1-9][0-9]{0,2}' /etc/sysconfig/network-scripts/ifcfg-ens192
或者:
# egrep --only-matching '([1-9][0-9]{0,2}\.){3}[1-9][0-9]{0,2}' /etc/sysconfig/network-scripts/ifcfg-ens192
(补充:这里以匹配 /etc/sysconfig/network-scripts/ifcfg-ens192 里的 IP 地址为例)
(注意:这里匹配后只显示 IP 地址,而不显示 IP 地址所在行里的其他内容)
# egrep -i '([1-9][0-9]{0,2}\.){3}[1-9][0-9]{0,2}' /etc/sysconfig/network-scripts/ifcfg-ens192
或者:
# egrep --ignore-case '([1-9][0-9]{0,2}\.){3}[1-9][0-9]{0,2}' /etc/sysconfig/network-scripts/ifcfg-ens192
(补充:这里以匹配 /etc/sysconfig/network-scripts/ifcfg-ens192 文件里含有 IP 地址的行并忽略大小写为例)
# egrep -c '([1-9][0-9]{0,2}\.){3}[1-9][0-9]{0,2}' /etc/sysconfig/network-scripts/ifcfg-ens192
或者:
# egrep --count '([1-9][0-9]{0,2}\.){3}[1-9][0-9]{0,2}' /etc/sysconfig/network-scripts/ifcfg-ens192
(补充:这里以匹配 /etc/sysconfig/network-scripts/ifcfg-ens192 文件里含有 IP 地址的行的数量为例)
# egrep --color=auto '([1-9][0-9]{0,2}\.){3}[1-9][0-9]{0,2}' /etc/sysconfig/network-scripts/ifcfg-ens192
(补充:这里以匹配 /etc/sysconfig/network-scripts/ifcfg-ens192 文件里含有 IP 地址的行并自动添加颜色为例)
# egrep --color=no '([1-9][0-9]{0,2}\.){3}[1-9][0-9]{0,2}' /etc/sysconfig/network-scripts/ifcfg-ens192
(补充:这里以匹配 /etc/sysconfig/network-scripts/ifcfg-ens192 文件里含有 IP 地址的行并取消自动添加颜色为例)
# grep -e root -e zhumingyu /etc/passwd
(补充:这里以匹配 /etc/passwd 文件中包含 root 或 zhumingyu 的行为例)
# grep -a 10 eternalcenter test.txt
或者:
# grep --text 10 eternalcenter test.txt
(补充:这里以匹配 test.txt 文件中包含 eternalcenter 的行并显示其前 10 行为例)
# grep -b 10 eternalcenter test.txt
或者:
# grep --byte-offset 10 eternalcenter test.txt
(补充:这里以匹配 test.txt 文件中包含 eternalcenter 的行并显示其后 10 行为例)
# grep -a -b 10 eternalcenter test.txt
或者:
# grep --text --byte-offset 10 eternalcenter test.txt
(补充:这里以匹配 test.txt 文件中包含 eternalcenter 的行并显示其前后 10 行为例)
# grep -q root /etc/passwd
或者:
# grep --quiet root /etc/passwd
或者:
# grep --silent root /etc/passwd
# echo $?
0
(
补充:
1) 这种方法主要用于在 Shell 脚本中,随后使用 if 判断判断匹配是否成功
2) 这里以匹配 /etc/passwd 中是否包含 root 用户为例
)
# awk <option> '<condition>{<command>}' <file>
或者:
# awk <option> ' BEGIN{<option> <command>} {<command>} END{<command>}' <file>
(
补充:在这里
1) BEGIN{ } 里的指令只执行 1 次,并且是最先执行
2) { } 里的指令会一行行地执行文件里的内容
3) END{ } 里指令只执行 1 次,并且是最后执行
)
awk 默认是以空格分割列,但是也可以通 -F 参数指定分割每一列的符号
将变量导入 awk 中,并可以通过 ‘{print (<variable>)}’ 将变量显示出来
1) RS 全名为 Record Separator (输入记录分隔符)
2) ORS 全名为 Output Record Separate (输出记录分隔符)
3) FS 全名为 Field Separator (输入字段分隔符)
4) OFS 全名为 Output Field Separator (输出字段分隔符)
1) RS=”” 每 1 次读取 1 个段落,默认情况下在 awk 中,把没有空行分割的多行会被定义为 1 个段落
2) RS=”\0″ 一次性读取所有内容,但是前提是 \0 字符不能在文件中存在
3) RS=”^$” 一次性读取所有内容
4) RS=”\n+” 按行读取内容,并且忽略空行
1) sub 只匹配第一个字符串,类似于 sed ‘s//’
2) gsub 匹配所有字符串,类似于 sed ‘s//g’
# sub (<original string or regular expression>, <substitution string>):
# sub (<original string or regular expression>, <substitution string>, <target string>)
# gsub (<original string or regular expression>, <substitution string>):
# gsub (<original string or regular expression>, <substitution string>, <target string>)
1) $0 文本当前行的全部内容
2) $1 文本的第 1 列
3) $2 文本的第 2 列
4) $3 文本的第 3 列
(补充:“$” 号后面的数字以此类推)
5) NR 文本当前行的行数,也就是目前处于第几行
6) NF 文本当前行的列数,也就是目前一共有几列
7) $(NF-1) 文本倒数第 1 列
8) $(NF-2) 文本倒数第 2 列
9) $(NF-3) 文本倒数第 3 列
10) , 代表空格
11) \t 代表 tab 制表位,就是比一个空格更多的空格
12) FILENAME 当前文件名
13) IGNORECASE 是否忽略大小写,当 IGNORECASE=1 时则忽略大小写
# awk '{print $1,$3}' test.txt
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
# awk '{print $1,$3}' test.txt
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
# awk '{print $1,$3}' test.txt
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
# awk '{print $(NF-2)}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk -F: '{print NR,NF}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# df -h | awk '{print $5}'
# df -h / | tail -1 | awk '{print $5}'
或者:
# df -h / | awk 'END{print $5}'
# cat test.txt | awk '{$1="";print}' | sed -r 's/( )(.*)/\2/'
(
补充:
1)这里的 /etc/passwd 是要被 awk 操作的测试文件
2)这里的 $1=”” 是将第 1 列的内容变为空
3)这里的 print 作用相当于 print $0
)
# awk -F: '{print NR,NF,$1,$NF}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk 'END{print --NR}' test.txt
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
# awk 'END{print ++NR}' test.txt
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
# echo eternalcenter | awk 'END{print length($1)}'
# awk -F: '{print "\047 $1 \047"}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
(注意:这里的 \047 代表的是单引号 “’”)
# awk '{print substr($2,1,3)}' test.txt
或者:
# awk '{$a=substr($2,1,3);print $a;}'
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
(注意:在 awk 当中字符索引 substr 都是从第 1 个开始的,不是从第 0 个开始的)
# awk '{print substr($2,1,)}' test.txt
# echo eternal-center-zmy | awk '{split ($0,a,"-");for (i in a) print a[i]}'
# awk 'BEGIN{FIELDWIDTHS="2 2:4 2:3"}{print $2}' test.txt
(
补充:
1) FIELDWIDTH 函数的作用是:按照字符的数量划分列,有 FS 的话也会覆盖 FS 覆盖划分列的方式
2) 这里的 FILEDWITHS=”2 2:4 2:3″ 代表第 1 列有 2 个字符,相隔 2 个字符后第 2 列开始有 4 个字符,再相隔 2 个字符后第 3 列开始有 3 个字符
3) 这里的 test.txt 是要被 awk 操作的测试文件
)
或者:
# awk -vFIELDWIDTHS="2 2:4 2:3" '{print $2}' test.txt
(
补充:
1) FIELDWIDTH 的作用是:按照字符的数量划分列,有 FS 的话也会覆盖 FS 覆盖划分列的方式
2) 这里的 FILEDWITHS=”2 2:4 2:3″ 代表第 1 列有 2 个字符,相隔 2 个字符后第 2 列开始有 4 个字符,再相隔 2 个字符后第 3 列开始有 3 个字符
3) 这里的 test.txt 是要被 awk 操作的测试文件
)
# awk 'BEGIN{FIELDWIDTHS="2 6 5"}{print $2}' test.txt
(
补充:
1) FIELDWIDTH 函数的作用是:按照字符的数量划分列,有 FS 的话也会覆盖 FS 覆盖划分列的方式
2) 这里的 FILEDWITHS=”2 6 5″ 代表第 1 列有 2 个字符,第 2 列开始有 6 个字符,第 3 列开始有 5 个字符
3) 这里的 test.txt 是要被 awk 操作的测试文件
)
或者:
# awk -vFIELDWIDTHS="2 6 5" '{print $2}' test.txt
(
补充:
1) FIELDWIDTH 函数的作用是:按照字符的数量划分列,有 FS 的话也会覆盖 FS 覆盖划分列的方式
2) 这里的 FILEDWITHS=”2 6 5″ 代表第 1 列有 2 个字符,第 2 列开始有 6 个字符,第 3 列开始有 5 个字符
3) 这里的 test.txt 是要被 awk 操作的测试文件
)
# awk '{ printf "%-9s %-8s %-8s\n", $1, $2, $3 }' test.txt
(
补充:
1) 这里以设置第 1 列和第 2 列之间间隔 9 个空格,第 2 列和第 3 列之间间隔 8 个空格为例
2) 这里的 test.txt 是要被 awk 操作的测试文件
)
# awk '{ printf "%-4s %-8s %-6s", $1, $2, $3 }' test.txt
(
补充:
1) 这里以设置第 1 列和第 2 列之间间隔 9 个空格,第 2 列和第 3 列之间间隔 8 个空格,且每行之间间隔 6 个空格为例
2) 这里的 test.txt 是要被 awk 操作的测试文件
)
# awk -F: '{print $1,$7}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk -F [:.] '{print $1,$10}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk 'BEGIN{FPAT="[^,]+|\".*\""}{print $2}' test.txt
(
补充:
1) FPAT 函数的作用是:使用正则表达式进行匹配,将匹配成功的部分作为列
3) 这里以不包含逗号 “,” 和两个双引号 “” 包括两个双引号 “” 里的内容作为列
2) 这里的 test.txt 是要被 awk 操作的测试文件
)
# awk '{arr[$2]=arr[$2]+1;if(arr[$2]==1){print}}' test.txt
或者:
# awk '{arr[$2]++;if(arr[$2]==1){print}}' test.txt
或者:
# awk '{++arr[$2];if(arr[$2]==1){print}}' test.txt
或者:
# awk '!arr[$2]++{print}' test.txt
(
补充:
1) 当把 arr[$2] 放到大括号 “{}” 外面时它自身就是 1 个判断,当 arr[$2] 第 1 次遭遇某个内容时,arr[$2] 此时的值是 0 ,然后才进行 ++ (也就是加 1),而当 arr[$2] 的值是 0 时,给他取反的 !arr[$2] 就是布尔真,而布尔为真时就执行 {print}
2) 当后来 arr[$2] 不是第 1 次遭遇某个内容时,arr[$2] 的值就不是 0 了,而给他取反的 !arr[$2] 就是布尔假了,也就不会再执行后面的 {print}
3) 以此类推
4) 这里的 test.txt 是要被 awk 操作的测试文件
)
# ifconfig | awk 'BEGIN{RS=""}{print}'
# ifconfig | awk 'BEGIN{RS=""}NR==1{print}'
# ifconfig | awk '/inet/&&!($2~/^127/){print $2}'
或者:
# ifconfig | awk 'BEGIN{RS=""};!/127.0.0.1/{print $6}'
或者:
# ifconfig | awk 'BEGIN{RS="";FS="\n"}!/127.0.0.1/{$0=$2;FS=" ";$0=$0;print $2}'
(
补充:
1) 执行 RS=”” 每次读取 1 个段落
2) 执行 !/lo/ 不读取带 lo 的段落
3) 执行 FS=”\n” 将换行符 “\n” 设置为分隔符
4) 执行 !/127.0.0.1/ 只选择不带 127.0.0.1 的段落
5) 执行 $0=$2 将此段落里的内容换成第 2 行的内容 ($0 代表所有内容),设置了 FS 之后,需要重新给 $0 赋值以后才能让 FS 的新值生效
6) 执行 FS=” ” 将空格 “ ” 设置为分隔符
7) 执行 $0=$0 让所有内容等于所有内容 ($0 代表所有内容),设置了 FS 之后,需要重新给 $0 赋值以后才能让 FS 的新值生效
8) 执行 print $2 打印第 2 列
)
或者:
# ip a s | awk '/[1-2]?[0-9]{0,2}\.[1-2]?[0-9]{0,2}/&&!/127.0.0.1/{print $2}'
# awk '~/1.eternalcenter.com/,~/5.eternalcenter.com/' test.txt
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
# vim awk.txt
创建以下内容:
index($0, "[mysql]"){
print
while( (getline var) > 0 ){
if(var ~ /\[.*\]/){exit}
print var
}
}
# awk -f awk.txt /etc/my.cnf
(
补充:
1) 这里以创建和执行 awk.txt 文件为例
2) 执行 index($0, “[mysql]”),搜索 $0 中内容包含 [mysql] 的行 ($0 代表所有内容)
3) 执行 print 将匹配到的这 1 行显示出来
4) getline 有 3 类返回值,当返回值大于 0 时,表示已经读取到了内容。当返回值等于 0 时,表示没有读取到内容,第一行就是 EOF 结尾。当返回值小于 0 时,则代表没读取内容报错
5) 执行 while( (getline var) > 0 ){print var},从 [mysql] 这 1 行往下第 1 行开始往下 1 行 1 行地读取内容,并形成循环,每读取有 1 行,就将内容赋值给变量 var,且 getline 的返回值就为 1,确定 (getline var) 的返回值大于 0 时将 var 的内容显示出来
6) 执行 if(var ~ /[.*]/){exit} 如果匹配到变量 var 里的内容包含中括号了 “[]” 则显示出来
7) 这里的 /etc/my.cnf 是要被 awk 操作的测试文件
)
或者:
# echo '[mysql]' ; awk 'index($0, "[mysql]"){while((getline var)>0){if(var ~/\[.*\]/){exit} print var}}' /etc/my.cnf
(
补充:
1) 执行 echo ‘[mysql]’ 显示 echo ‘[mysql]’
2) 执行 index($0, “[mysql]”),搜索 $0 中内容包含 [mysql] 的行 ($0 代表所有内容)
3) getline 有 3 类返回值,当返回值大于 0 时,表示已经读取到了内容。当返回值等于 0 时,表示没有读取到内容,第一行就是 EOF 结尾。当返回值小于 0 时,则代表没读取内容报错
4) 执行 while( (getline var) > 0 ){print var},从 [mysql] 这 1 行往下第 1 行开始往下 1 行 1 行地读取内容,并形成循环,每读取有 1 行,就将内容赋值给变量 var,且 getline 的返回值就为 1,确定 (getline var) 的返回值大于 0 时将 var 的内容显示出来
5) 执行 if(var ~ /[.*]/){exit} 如果匹配到变量 var 里的内容包含中括号了 “[]” 则显示出来
6) 这里的 /etc/my.cnf 是要被 awk 操作的测试文件
)
# vim awk.txt
创建以下内容:
index($0, "/*"){
#if in the same line with */
if (index ($0,"*/")){
print gensub("^(.*)\\/\\*.*\\*\\/(.*)$","\\1\\2","g",$0)
}
else {
#if not in the same line with */
#display the content before /*
print gensub("^(.*)/\\*.*","\\1","g",$0)
#alaways read until encountered */
while( (getline var) > 0 ){
if(index(var,"*/")){
print gensub("^.*\\*/(.*)","\\1","g",var)
break
}
}
}
}
!index($0, "/*"){
print
}
# awk -f awk.txt test.txt
(
补充:
1) 这里以创建和执行 awk.txt 文件为例
2) 这里的 test.txt 是要被 awk 操作的测试文件
3) gensub 函数的格式是:gensub(“”,””,”g”,),作用是:将字符串中的某些字符进行替换
4) getline 有 3 类返回值,当返回值大于 0 时,表示已经读取到了内容。当返回值等于 0 时,表示没有读取到内容,第一行就是 EOF 结尾。当返回值小于 0 时,则代表没读取内容报错
5) 执行 while( (getline var) > 0 ){print var},从 [mysql] 这 1 行往下第 1 行开始往下 1 行 1 行地读取内容,并形成循环,每读取有 1 行,就将内容赋值给变量 var,且 getline 的返回值就为 1,确定 (getline var) 的返回值大于 0 时将 var 的内容显示出来
)
# vim awk.txt
添加以下内容:
BEGIN{
RS="]\n"
ORS=RS
}
{
if($0 ~ /ok/ && prev ~ /order/){
print prev
print $0
}
prev = $0
}
# awk -f awk.txt test.txt
(
补充:
1) 这里以创建和执行 awk.txt 文件为例
2) 这里的 test.txt 是要被 awk 操作的测试文件
)
# awk '{print FILENAME}' test.txt
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
# awk -F: '$1=="root"{ $3 = '1';print }' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# echo "a- b c 2022-01-01 a:d" | awk 'gsub(/-/,"",$4)'
# echo "z m 7 2022-01-01 a:d" | awk '$4=gsub(/-/,"",$4)'
# echo "z- m y 2021-11-11 z:y" | awk '$4=gsub(/-/,"")'
z m y 3 z:y
# echo "z m y z-m-y 2022-01-01 z:y" | awk 'gsub(/-/,"")'
z m y zmy 20211111 z:y
或者:
# echo eternal-center-zmy | awk 'BEGIN{ FS="-";}{print $1,$2,$3}'
eternal center zmy
或者:
# echo eternal-center-zmy | awk '{split ($0,a,"-");print a[1],a[2],a[3]}'
eternal center zmy
# echo "a- b c 2022-01-01 a:d" | awk '{gsub(/-|:/, "");print}'
# echo eternal-center-zmy | awk 'BEGIN{ FS="-";OFS="***"}{print $1,$2,$3}'
eternal***center***zmy
# cat test.txt
eternalcenter.com-ec-myz
eternalcentre.com-ec-myz
eternalcenter.org-ec-myz
eternalcentre.org-ec-myz
# awk 'BEGIN{ OFS="." }{ print NR,$0 }' test.txt
1.eternalcenter.com-ec-myz
2.eternalcentre.com-ec-myz
3.eternalcenter.org-ec-myz
4.eternalcentre.org-ec-myz
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
# echo "a b c d" | awk '{$2=$2" e f g";print}'
(补充:修改字段或 NF 的值后 $0 会进行重建并进行联动效应)
# echo "a b c d" | awk '{$2=$2;print}'
(补充:OFS 默认等于一个空格 “ ”,这里修改了 $2 的值以后, awk 会根据 OFS 的值重建 $0 ($0 代表所有内容),它会去使用 OFS 的值去链接各个字段)
# echo "a b c d" | awk 'BEGIN{OFS="\t"}{$1=$1;print}'
(补充:OFS 默认等于 1 个空格 “ ”,在这里先试将 OFS 的值修改成了 “\t”,再修改了 $2 的值以,此时 awk 会根据 OFS 的值重建 $0 ($0 代表所有内容),它会去使用 OFS 的值去链接各个字段)
# cat test.txt
eternalcenter.com|201901ec|com
eternalcentre.com|201902ec|com
zhumingyu.com|201903zmy|com
mingyuzhu.com|201904myz|com
eternalcenter.org|201905ec|org
eternalcentre.org|201906ec|org
# awk -F '|' 'BEGIN{ OFS="|" }{sub(/[0-9]+/,"",$2);print$0}' test.txt
eternalcenter.com|ec|com
eternalcentre.com|ec|com
zhumingyu.com|zmy|com
mingyuzhu.com|myz|com
eternalcenter.org|ec|org
eternalcentre.org|ec|org
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
或者:
# cat test.txt
eternalcenter.com|201901ec|com
eternalcentre.com|201902ec|com
zhumingyu.com|201903zmy|com
mingyuzhu.com|201904myz|com
eternalcenter.org|201905ec|org
eternalcentre.org|201906ec|org
# awk -F '|' -v OFS='|' '{sub(/[0-9]+/,"",$2);print $0}' test.txt
eternalcenter.com|ec|com
eternalcentre.com|ec|com
zhumingyu.com|zmy|com
mingyuzhu.com|myz|com
eternalcenter.org|ec|org
eternalcentre.org|ec|org
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
# cat test.txt
m.y.z
# awk 'BEGIN{RS=".";}{print $0}' test.txt
m
y
z
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
# cat test.txt
m
y
z
# awk 'BEGIN{ORS=".";}{print $0}' test.txt
m.y.z.
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
# awk '{for(i=1;i<=NF;i++){arr[i]=arr[i]" "$i}}END{for(i=1;i<=NF;i++){print arr[i]}}' test.txt
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
# awk '{for(i=1;i<=NF;i++){if(i in arr){arr[i]=arr[i]" "$i}else{arr[i]=$i}}}END{for(i=1;i<=NF;i++){print arr[i]}}' test.txt
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
# awk '{for(i=1;i<=NF;i++){if(i in arr){arr[i]=arr[i]" "$i}else{arr[i]=$i}}}END{for(i=1;i<=NF;i++){print arr[i]}}' test.txt | sort | sed -e :a -e '$!N;/^\(.....\).*\n\1.*/s/^\(.*\)\(\n\)\(.....\)\(.*\)/\1\4/g; ta'
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
# awk '{for(i=1;i<=NF;i++){if(i in arr){arr[i]=arr[i]" "$i}else{arr[i]=$i}}}END{for(i=1;i<=NF;i++){print arr[i]}}' test.txt | sort | sed -e :a -e '$!N;/^\(.*\.com\).*\n\1.*/s/^\(.*\)\(\n\)\(.*\.com\)\(.*\)/\1\4/g; ta'
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
# awk '{for(i=1;i<=NF;i++){if(i in arr){arr[i]=arr[i]" "$i}else{arr[i]=$i}}}END{for(i=1;i<=NF;i++){print arr[i]}}' test.txt | sort | sed -e :a -e '$!N;/^\(.*\ \).*\n\1.*/s/^\(.*\)\(\n\)\(.*\ \)\(.*\)/\1 \4/g; ta'
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
# awk 'BEGIN {"date"|getline d; print d}'
# content=eternalcenter
# awk '{print "$content"}'
content
# awk '{print '$content'}'
eternalcenter
(注意:awk 在使用变量时必须使用单引号 “””,否则会把变量名称当作字符串)
# value=eternalcenter
# echo | awk -v content=$value '{print(content)}'
eternalcenter
# gawk -F: '($1 == n) {print $1,$2,$3}' n=mingyuzhu /etc/group
(补充:这里的 /etc/group 是要被 gawk 操作的测试文件)
如果变量 value 的值为 eternalcenter 则显示 0 否则显示 1
# echo eternalcenter | awk -v value="eternalcenter" '{print($1==value)? "0":"1"}'
或者:
# echo eternalcenter | awk -v value="eternalcenter" 'BEGIN{if($1==value){result=0}else(result=1)} END{print result}'
# awk -F: '{print $1,"interpreter:",$7}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk '/Failed/{print $11}' /var/log/secure
或者:
# awk 'index($0,"Failed"){print $11}' /var/log/secure
(补充:这里的 /var/log/secure 是要被 awk 操作的测试文件)
# awk -F: '/bash$/{print}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk -F: '/^(root|adm)/{print $1,$3}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk -F: '/^[ra]/{print $1,$3}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk -F: '$1~/root/' /etc/passwd
或者:
# awk -F: '$1 ~ /root/' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk -F: '$7!~/nologin$/{print $1,$7}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk -F: '($7 != "'"/sbin/nologin"'" && $7 !="/bin/false") { print $1 " " $6 }' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# ifconfig eth0 | awk '/RX p/{print $5}'
# df -h | awk '/\/$/{print $4}'
# awk -F: '$1 ~/[0-9][0-9]$/(print $1}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk -F '/^root/,/^mysql/{print $1}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk -F: 'NR==3{print}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk -F: '$3==1000{print $1,$3}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk -F: '$3!=1000{print $1,$3}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk -F: '$3>=1000{print $1,$3}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk -F: '$3<10{print $1,$3}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk -F: '$3>10 && $3<20' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk -F: '$3>1000 || $3<10' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk -F: '$3 * $4 <100' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk -F: '$1=="root"' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk '{if($1=="test1"&&$2=="test2"){print}}' test.txt
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
# awk '$1~/test1/&&$2~/test2/' test.txt
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
# awk '{if($1=="test1"||$2=="test2"){print}}' test.txt
或者:
# awk '{if($1=="test1"){print};if($2=="test2"){print}}' test.txt
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
# awk '$1~/test1/;$2~/test2/' test.txt
或者:
# awk '$1~/test1/||$2~/test2/' test.txt
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
# awk 'BEGIN{print x+1}'
或者:
# awk 'BEGIN{x++;print x}'
(注意:这里的 x 可以不定义,直接用,默认值为 0)
# awk 'BEGIN{x=8;print x+=2}'
(注意:这里的 x 可以不定义,直接用,默认值为 0)
# awk 'BEGIN{x=8;x--;print x}'
(注意:这里的 x 可以不定义,直接用,默认值为 0)
# awk 'BEGIN{print 2+3}'
# awk 'BEGIN{print 3.2+3.5}'
# awk 'BEGIN{print 2*3}'
# awk 'BEGIN{print 2*3+3}'
# awk 'BEGIN{print (3+3)*2}'
# awk 'BEGIN{print 23%8}'
# awk -F: '$3 + 10' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# seq 200 | awk '$1%3==0'
# seq 100 | awk '$1%7==0||$1~/7/'
# awk -F: 'BEGIN{total=0}{total+=$4}END{print total}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# cat test.txt
Tom 2022-01-01 100
John 2022-02-05 300
Tom 2022-03-20 400
John 2022-01-22 200
Tom 2022-01-05 500
# awk '{split($2,a,"-");if(a[2]==01){b[$1]+=$3}}END{for(i in b)print i,b[i]}' test.txt
# awk 'BEGIN{x=0}/bash$/{x++} END{print x}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk -F: '{if($3<=1000){i++}}END{print i}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk -F: '{if($3>1000){i++}}END{print i}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk -F: '{if($7~/bash$/){i++}}END{print i}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk -F: '{result=$3+$4; printf result}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk '{print $3/$2 * 100.0}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk '{a[$1]++}END{for(i in a){print i,a[$i]}}' /usr/local/nginx/logs/access.log
(补充:这里的 /usr/local/nginx/logs/access.log 是要被 awk 操作的测试文件)
# echo "z m 7 2022-01-01 a:d" | awk '$4=gsub(/-/,"",$4)'
# echo "z- m y 2021-11-11 z:y" | awk '$4=gsub(/-/,"")'
z m y 3 z:y
# awk -F: '{if($3<=1000){i++}else{j++}} END{print i,j}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk -F: '{if($7~/bash$/){i++}else{j++}} END{print i,j}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk -F: '{print ($3=0 ? "root": not root)}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk -F: 'BEGIN{max=1000}{id=($3>max ?$3 :"system id");print id}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk '{if (length($1) > 3) print $1}' test.txt
# awk '{IGNORECASE=1;if($2=="a"){print $2}}' test.txt
# awk 'BEGIN{a[0]=0;a[1]=11;a[2]=22;for(i in a){print i,a[i]}}'
# awk '{ip[$1]++} END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log
(
补充:
1) 这里的 /var/log/httpd/access_log 是要被 awk 操作的测试文件
2) 这里以统计 /var/log/httpd/access_log 文件里第 1 列的 IP 地址为例
)
# awk '{ip[$1]++} END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log | sort -k2nr
(
补充:
1) 这里的 /var/log/httpd/access_log 是要被 awk 操作的测试文件
2) 这里以统计 /var/log/httpd/access_log 文件里第 1 列的 IP 地址为例
)
# awk '$8!=200{ip[$1]++}END{for(i in ip){print ip[i],i}}' /var/log/httpd/access_log
(
补充:
1) 这里的 /var/log/httpd/access_log 是要被 awk 操作的测试文件
2) 这里以统计 /var/log/httpd/access_log 文件里第 1 列的 IP 地址为例
)
# awk '$8!=200{ip[$1]++}END{for(i in ip){print ip[i],i}}' /var/log/httpd/access_log | sort -k1nr | head -n
(
补充:
1) 这里的 /var/log/httpd/access_log 是要被 awk 操作的测试文件
2) 这里以统计 /var/log/httpd/access_log 文件里第 1 列的 IP 地址为例
)
或者:
# awk '$8!=200{ip[$1]++}END{PROCINFO["sorted_in"]="@val_num_desc";for(i in ip){if(count++=10){exit}print ip[i],i}}' /var/log/httpd/access_log
(
补充:
1) 这里的 /var/log/httpd/access_log 是要被 awk 操作的测试文件
2) 这里以统计 /var/log/httpd/access_log 文件里第 1 列的 IP 地址为例
3) 这里的 PROCINFO[“sorted_in”]=”@val_num_desc” 表示在 for(i in ip) 时通过 ip[i] 的数值进行降序排序,也就是 ip 数组中,最大的一个值会排在前面
)
# ss -ntulap 2> /dev/null | awk '/^tcp/{tcp[$6]++} END{for(i in tcp){print i,tcp[i]}}'
或者:
# ss -ntulap 2> | grep 'tcp' | awk '{print $6}' | sort | uniq -c
# vim awk.txt
创建以下内容:
BEGIN{
FS=" "
}
{
if(!arr[$1,$2]++){
arr1[$1]++
}
}
END{
for(i in arr){
print i,arr[i] >(i".txt")
}
}
# awk -f awk.txt test.txt
(
补充:
1) 这里以创建和执行 awk.txt 文件为例
2) 这里的 test.txt 是要被 awk 操作的测试文件
3) 这里以统计 test.txt 文件里第 1 列的网页和第 2 列第 IP 地址为例
4) 这里当把 arr[$1,$2] 放到 if 的小括号 “()” 里面时,它是 1 个判断,当 arr[$1,$2] 第 1 次遭遇某个内容时,arr[$1,$2] 此时的值是 0 ,然后才进行 ++ (也就是加 1),而当 arr[$1,$2] 的值是 0 时,给他取反的 !arr[$1,$2] 就是布尔真,而布尔为真时就执行 arr1[$1]++
5) 当后来 arr[$1,$2] 不是第 1 次遭遇某个内容时,arr[$1,$2] 的值就不是 0 了,而给他取反的 !arr[$1,$2] 就是布尔假了,也就不会再执行后面的 arr1[$1]++
)
或者:
# vim awk.txt
创建以下内容:
BEGIN{
FS=" "
}
!arr[$1,$2]++ {
arr1[$1]++
}
END{
for(i in arr){
print i,arr[i] >(i".txt")
}
}
# awk -f awk.txt test.txt
(
补充:
1) 这里以创建和执行 awk.txt 文件为例
2) 这里的 test.txt 是要被 awk 操作的测试文件
3) 这里以统计 test.txt 文件里第 1 列的网页和第 2 列第 IP 地址为例
4) 这里当把 arr[$1,$2] 放到大括号 “{}” 外面时它自身就是 1 个判断,当 arr[$1,$2] 第 1 次遭遇某个内容时,arr[$1,$2] 此时的值是 0 ,然后才进行 ++ (也就是加 1),而当 arr[$1,$2] 的值是 0 时,给他取反的 !arr[$1,$2] 就是布尔真,而布尔为真时就执行 arr1[$1]++
5) 当后来 arr[$1,$2] 不是第 1 次遭遇某个内容时,arr[$1,$2] 的值就不是 0 了,而给他取反的 !arr[$1,$2] 就是布尔假了,也就不会再执行后面的 arr1[$1]++
)
# awk -F: '{i=1;while(i<NF) {print NR,$i;i++}}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
或者:
# awk -F: '{for(i=1;i<NF;i++) {print NR,$i}}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# 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")}'
(
补充:
1) 执行 seq 9 命令,第 1 行输出 1,第 2 行输出 2,以此类推直到第 9 行,并将结果传输给 sed 命令
2) 执行 sed 的 H 参数,将 pattern space (模型空间) 中的内容 append (添加) 到 hold space (保持空间) 分行符 “/n” 后,并将此时的 pattern space (模型空间) 传输给 g 参数。当执行到第 1 行时,添加到 hold space (保持空间) 是 1,hold space (保持空间) 里的值是 \n1,当时执行到第 2 行时,添加到 hold space (保持空间) 是 2,hold space (保持空间) 里的值是 \n1\n2,依次类推
3) 执行 sed 的 g 参数,将 hold space (保持空间) 中的内容拷贝到 pattern space (模型空间) 中,原来 pattern space (模型空间) 里的内容被清除。当执行到第 1 行时,hold space (保持空间)里的值是 \n1,pattern space (模型空间) 里的值将是 \n1,显示的结果也会是 1,当执行到第 2 行时,hold space (保持空间)里的值是 \n1\n2,pattern space (模型空间) 里的值将是 \n1\n2,显示的结果也会是 \n1\n2,依次类推,并将结果传输给命令 awk
3) awk,将多行视为 1 行,之后执行从 1 到此行列数次循环,变量 i 初始时的值为 1,每执行 1 次则变量 i 到值会加 1,每次循环时会显示:“此时变量 i 的值”*“此行的列数”=“此时变量 i 的值和此行的列数的乘积““当此时变量 i 的值等于此行的列数时则换行,否则的话则显示制表符的空格长度”。当执行到第 1 行时显示的是 1×1=1,当执行到第 2 行时显示的是 1×2=2 2×2=4,以此类推
)
在开始显示自定义的 1 行,在结尾再显示自定义的 1 行,并且将 “:” 视为分割符
# awk -F: 'BEGIN{print "User\tUID\tHome"}{print $1 "\t" $3 "\t" $6}END{print "Total",NR,"lines."}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
# awk 'BEGIN{print systime()}'
# awk 'BEGIN{print mktime("2019 01 01 01 01 01")}'
或者:
# awk 'BEGIN{print mktime("2019 1 1 1 1 1")}'
或者:
# vim awk.txt
创建以下内容:
BEGIN{
str="2019-01-01T01:01:01+8:00"
patsplit(str,arr,"[0-9]{1,4}")
Y=arr[1]
M=arr[2]
D=arr[3]
H=arr[4]
m=arr[5]
S=arr[6]
print mktime(sprintf("%s %s %s %s %s",Y,M,D,H,m,S))}
}
# awk -f awk.txt
(
补充:
1) 这里以创建和执行 awk.txt 文件为例
2) patsplit 函数的格式是:patsplit(<string>,<array>,”<regular expression>”),其中第 1 个是要匹配的字符串,第 2 个是要匹配结果存储进去的数组,第 3 个是正则表达式,通过正则表达式匹配字符串,然后将匹配成功的部分保存到数组中去
3) mktime 函数的格式是:mktime(‘YYYY MM DD HH mm SS [D9T]’),作用是:构建时间,如果构建成功则显示这个时间点秒级的 epoch 值,如果构建失败则返回 -1
)
# date -d '@1546275661' +"%F %T"
# vim awk.txt
创建以下内容:
BEGIN{
str="2021-01-01T01:01:01+08:00"
choose_time = mktime("2021 01 01 01 01 01")
}
function strptime_now(str ,arr,Y,M,D,H,m,S) {
patsplit(str,arr,"[0-9]{1,4}")
Y=arr[1]
M=arr[2]
D=arr[3]
H=arr[4]
m=arr[5]
S=arr[6]
return mktime(sprintf("%s %s %s %s %s %s",Y,M,D,H,m,S))
}
{
#[2022-01-01T01:01:01+8:00]
match($0,"^.*\\[(.*)\\].*",arr)
tmp_time = strptime_now(arr[1])
if(tmp_time > choose_time){
print
}
}
# awk -f awk.txt test.txt
(
补充:
1) 这里以创建和执行 awk.txt 文件为例
2) 这里的 test.txt 是要被 awk 操作的测试文件
3) 默认情况下 Y=arr[1] 等是在定义全局变量,这里的 strptime(str ,arr,Y,M,D,H,m,S) 是指将全局变量转换成局部变量,这样此函数执行完以后变量就被删除了
4) patsplit 函数的格式是:patsplit(<string>,<array>,”<regular expression>”),其中第 1 个是要匹配的字符串,第 2 个是要匹配结果存储进去的数组,第 3 个是正则表达式,通过正则表达式匹配字符串,然后将匹配成功的部分保存到数组中去
5) mktime 函数的格式是:mktime(‘YYYY MM DD HH mm SS [D9T]’),作用是:构建时间,如果构建成功则显示这个时间点秒级的 epoch 值,如果构建失败则返回 -1
6) sprintf 函数的格式是:sprintf(“s%……”,<variable>……),作用是:显示变量里的内容,其中第 1 个是占位符,第 2 个是变量
7) match 函数的格式是:match(<column>,”<regular expression>”,<array>),其中第 1 个是要匹配的列,第 2 个是正则表达式,第 3 个是要匹配结果存储进去的数组,作用是:以正则表达式匹配匹配某列,并将匹配结果存储在数组里
)
# vim awk.txt
创建以下内容:
BEGIN{
str="01/Jan/2022:21:30:30+8:00"
choose_time = mktime("2020 01 01 01 01 01")
}
{
#[01/Jan/2022:21:30:30+8:00]
match($0,"^.*\\[(.*)\\].*",arr)
tmp_time = strptime(arr[1])
if(tmp_time > choose_time){
print
}
}
# 01/Jan/2022:21:30:30+8:00
function strptime(str ,dt_str,arr,Y,M,D,H,m,S) {
dt_str = gensub("[/:+-]"," ","g",str)
# 01 Jan 2020 01 01 01 01 01
split(dt_str,arr," ")
Y=arr[3]
M=mon_map(arr[2])
D=arr[1]
H=arr[4]
m=arr[5]
S=arr[6]
return mktime(sprintf("%s %s %s %s %s %s",Y,M,D,H,m,S))
}
function mon_map(str ,mons){
mons["Jan"]=1
mons["Feb"]=2
mons["Mar"]=3
mons["Apr"]=4
mons["May"]=5
mons["Jun"]=6
mons["Jul"]=7
mons["Aug"]=8
mons["Sep"]=9
mons["Oct"]=10
mons["Nov"]=11
mons["Dec"]=12
return mons[str]
}
# awk -f awk.txt test.txt
(
补充:
1) 这里以创建和执行 awk.txt 文件为例
2) 这里的 test.txt 是要被 awk 操作的测试文件
3) 默认情况下 Y=arr[1] 等是在定义全局变量,这里的 strptime(str ,arr,Y,M,D,H,m,S) 是指将全局变量转换成局部变量,这样此函数执行完以后变量就被删除了
4) gensub 函数的格式是:gensub(“<original character>”,”<new character>”,”g”,<string>),作用是:将字符串中的某些字符进行替换,其中第 1 个是原字符,第 2 个是新字符,第 3 个是要操作的字符串
5) split 函数的格式是:split(<string>,<array>,”<separator>”),作用是:将字符串里的内容分开存储到数组里,其中第 1 个是要操作的字符串,第 2 个是要存入内容的数组,第 3 个是分隔符
6) mktime 函数的格式是:mktime(‘YYYY MM DD HH mm SS [D9T]’),作用是:构建时间,如果构建成功则显示这个时间点秒级的 epoch 值,如果构建失败则返回 -1
7) sprintf 函数的格式是:sprintf(“s%……”,<variable>……),作用是:显示变量里的内容,其中第 1 个是占位符,第 2 个是变量
8) match 函数的格式是:match(<column>,”<regular expression>”,<array>),其中第 1 个是要匹配的列,第 2 个是正则表达式,第 3 个是要匹配结果存储进去的数组,作用是:以正则表达式匹配匹配某列,并将匹配结果存储在数组里
)
(注意:在 awk 中反译符号 “\“ 前面还必须要要有一个反译符号 ”\“,例如,如果要显示一个前引号 “””: \”)
# echo mingyuzhu | awk '{print "The content which echo command will execute is "$1;system("echo now is echo command "$1"")}'
(补充:这里以使用 awk 命令调用 Linux 系统中的 echo 命令显示 echo now is echo command mingyuzhu 为例 )
先把第 2 个文件的第 5 列删除,再用第 2 个文件的第 1 列减去第 1 个文件的第 1 列,再把得到的结果粘贴到原来第 2 个文件第 5 列对应的位置
# vim awk.txt
创建以下内容:
{
f1 = $1
if( (getline < "test2.txt") >= 0 ){
$5 = $1 - f1
print $0
}
}
# awk -f awk.txt test1.txt
(
补充:
1) 这里以创建和执行 awk.txt 文件为例
2) 这里的 test1.txt 和 test2.txt 是要被 awk 操作的测试文件
4) getline 有 3 类返回值,当返回值大于 0 时,表示已经读取到了内容。当返回值等于 0 时,表示没有读取到内容,第 1 行就是 EOF 结尾。当返回值小于 0 时,则代表没读取内容报错
5) 执行 getline < “test2.txt” 1 行 1 行地读取 test2.txt 文件里的内容
)
(注意:这里的 print $0 会根据 OFS 重建 $0,而默认情况下 OFS 是 1 个空格,所以这里重建后,列和列之间也会是 1 个空格)
或者:
# awk 'NR==FNR{arr[FNR]=$1}NR!=FNR{$5 = $1 - arr[FNR];print $0}' test1.txt test2.txt
(补充:这里 NR == FNR 的时候表示处理的是第 1 个文件,只有当处理第 1 个文件中时 NR 等于 FNR)