sed
# 先读取资料、存入模式空间、对其进行编辑、再输出、再用下一行替换模式空间内容
-n #不再显示模式空间中的内容(默认显示)
-i #直接对文本编辑
-r #正则可不转换特殊字符
--follow-symlinks #修改软链接文件时
匹配字符出现的次数
* #任意多个字符
? #0或者1个 最小匹配,没有加-r参数需要转义 ?
$ #最后一行
^ #开头行
.* #匹配任意多个字符
. #任意单个字符
^$ #空行
? #0或者1次
+ #至少出现1次
{3} #精确出现3次
{2,5} #出现2-5次
#转义符号
command
d
删除符合条件的行 #sed '1,2d' a.txt 删除文件中包含oot的行 #sed '/oot/d' a.txt 删除第一行及其后两行 #sed '1,+2d' a.txt 删除第一行 #sed '1d' a.txt
p
显示符合条件的行 显示以/开头的行 #sed -n '/^//p' a.txt
a string
在符合条件的行后面追加新行。string为追加的内容 在以/开头的行后面追加新行,#hello world sed '/^//a #hello world' a.txt 在以/开头的行后面追加两行内容,分别为# hello worl # hello linux # sed '/^//a # hello world # hello linux' a.txt
i string
在符合条件的行前添加新行,string为追加的内容 在文件第1行添加# hello world # sed '1i # hello world' a.txt
c string
替换指定行的内容 将文件中最后一行内容替换为End Of File # sed '$c End Of File' /1.txt # sed '7c SELINUX=disabled' /etc/sysconfig/selinux
=
用于显示每一行的行号 显示/etc/passwd文件最后一行的行号 # sed -n '$=' /etc/passwd 49
s/regex/string/[修饰符] 查找并替换 默认情况下,只替换每一行第1次出现的字符
修饰符:
g:替换每一行所
i:忽略大小写
[root@localhost ~]# sed 's/^#/?/' /etc/fstab 查找文件中的UUID,并替换为uuid # sed 's/UUID/uuid/' /etc/fstab 将行首的/替换成# # sed 's/^//#/' /etc/fstab [root@localhost ~]# sed 's|/|#|g' /etc/fstab 将每一行出现的所有/替换为@ # sed 's///@/g' /etc/fstab 删除行首的空格 [root@shellscript ~]# sed 's|^#||' /etc/fstab [root@shellscript ~]# history | sed 's|^[[:space:]]+||'
awk
1、awk内置变量之记录变量
FS: 指定读取文件时的分隔符,默认空白字符,相当于-F
OFS: 指定输出的分隔符,默认空白字符
[root@localhost ~]# head -n 1 /etc/passwd | awk -F: '{print $1,$7}'
root /bin/bash
[root@localhost ~]#
[root@localhost ~]# head -n 1 /etc/passwd | awk 'BEGIN{FS=":"}{print $1,$7}'
root /bin/bash
[root@localhost ~]# head -n 1 /etc/passwd | awk -F: '{print $1,$7}'
root /bin/bash
[root@localhost ~]# head -n 1 /etc/passwd | awk -F: 'BEGIN{OFS="---"}{print $1,$7}'
root---/bin/bash
2、awk内置变量之数据变量
NR:记录awk所处理的文本的行数,如果有多个文件,所有文件统一进行计数
[root@localhost ~]# awk '{print "第",NR,"行内容:",$0}' /etc/hosts /etc/issue
第 1 行内容: 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
第 2 行内容: ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
第 3 行内容: CentOS release 6.6 (Final)
第 4 行内容: Kernel
on an m
第 5 行内容:
注意:
print在显示变量值时,不需要使用$
FNR:记录awk正在处理的文件的行数,如果有多个文件,每个文件分别进行计数
[root@localhost ~]# awk '{print "第",FNR,"行内容:",$0}' /etc/hosts /etc/issue
第 1 行内容: 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
第 2 行内容: ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
第 1 行内容: CentOS release 6.6 (Final)
第 2 行内容: Kernel
on an m
第 3 行内容:
NF:记录awk正在处理的当前行被分隔成了几个字段
# cat test.txt
this is a test.
# awk '{print NF}' test.txt
4
# awk '{print $NF}' test.txt
test.
[root@localhost ~]# awk -F: '{print "Number of line: ", NF}' /etc/passwd
[root@shell ~]# awk -F. '{print "Number of Line: ", NF}' /etc/hosts
[root@shell ~]# awk 'BEGIN{FS="."}{print "Number of Line: ", NF}' /etc/hosts
Number of Line: 6
Number of Line: 3
Number of Line: 6