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 worldsed '/^\//a \#hello world' a.txt在以/开头的行后面追加两行内容,分别为# hello worl # hello linux # sed '/^\//a \# hello world\n# 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/passwd49
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 \r 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 \r 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/hostsNumber of Line: 6Number of Line: 3Number of Line: 6