SED
查找
sed -n '3p' /etc/yum.repos.d/test.repo.bak 查看文件第三行内容
sed -n '3,5p' /etc/yum.repos.d/test.repo.bak 查看文件第3-5行内容
sed -n '2p;5p' /etc/yum.repos.d/test.repo.bak 查看文件第2,5行内容
sed -n '1~2p' /etc/yum.repos.d/test.repo 查看文件隔一行的内容 1 3 5 7 9。。。。。。
插入字符
sed -i '3i zpq ' test.repo.new 第三行之前插入 字符行 zpq
sed -i '3a zpq ' test.repo.new 第三行之后插入 字符行 zpq
删除
sed -ri '3d' test.repo.new 删除第三行的内容
sed -ri.$(date +%F) '/base|enabled/d' test.repo.new
删除包含base,enabled的行 -r -i要放在最后 /d删除
.$(date +%F) 备份文件名称后缀
sed -ri '/^$/d' test.repo.new 删除空行
不加i则不执行,sed -i.BAK .BAK为备份参数,可谓其他值
替换
[root@localhost ~]# sed -i 's#text#test#g' test.repo
将text字符替换成test
整行替换
sed -i '1c [baseOS]' test.repo 将第一行整行替换成[baseOS]
sed -i '4s#1#0#g' test.repo 将第4行中的1替换成0
不加g只替换每行识别的第一个字符
touch zpq{1..9}.txt
ls | xargs -n1 | sed -r 's#(.*)txt#mv \1txt \1md #g' |bash
替换文件后缀名txt转md,原理:现将文件名称输出,查找后缀为TXT的文件,替换成bash命令mv并执行
echo zpq | sed -r 's#(.*)#<\1>#g'
将zpq字符添加<>输出
注意:-n 和 -i 不要一起使用,每次修改建议备份
-r 扩展正则表达式
!p !d 取反
for ((i=1;i<=11;i++));do echo {1..4} >> zpq2.txt; done
sed '/^$/d' zpq2.txt|sed 's# ##g' |sed '=' | xargs -n2
查看行数,先去除空行,将空格替换并输出行号 2列一组(包含序号)
AWK
ls -l `whick awk` 显示awk文件内容
命令结果引用:
echo laoma > 1.txt
touch `cat 1.txt`
[root@localhost zpq]# ll
total 4
-rw-r--r-- 1 root root 6 Nov 29 17:51 1.txt
-rw-r--r-- 1 root root 0 Nov 29 17:51 laoma
示例:
cp /etc/passwd . 复制passwd文件
vim passwd
:%s/:/ /g 将:替换成看空格符号
:wq!
cp passwd passwd.bak
column -t passwd.bak > passwd 纵向排列文件内容,并追加到passwd内容中
awk '/mail/ {print $3}' passwd 显示mail用户的UID
awk '/x/ {print $5}' passwd 输出passwd中第五项的内容
[root@localhost ~]# awk '/root/ {print }' passwd 显示整行的内容
[root@localhost ~]# awk '/root/ {print $1,$3,$5,$7}' passwd 使用,进行分隔多个参数
root 0 root /bin/bash
[root@localhost ~]# awk '/root/ {print $1,$3" && "$5,$7}' passwd 也可使用""进行分隔
root 0 && root /bin/bash
[root@localhost ~]# awk 'NR==2 {print $1,$3" && "$5,$7}' passwd 查看第二行相关列的参数
bin 1 && bin /sbin/nologin
[root@localhost ~]# awk '/spool/ {print $1,$3" && "$6,$7}' passwd 显示包含spool的参数
lp 4 && /var/spool/lpd /sbin/nologin
mail 8 && /var/spool/mail /sbin/nologin
awk -F "[ /]+" '/sbin/ {print $1,$5,$6}' passwd | column -t 指定空格和/符号作为分隔符,查找匹配的行,输出相关列参数
bin bin bin
daemon daemon sbin
adm adm var
lp lp var
sync sync sbin
shutdown shutdown sbin
halt halt sbin
mail mail var
[root@localhost ~]# awk '{print $(NF-1)}' passwd 查看文件倒数第二列的信息,注意先进行系列运算,在进行查找$(NF-1)
/root
/bin
/sbin
/var/adm
/var/spool/lpd
/sbin
/sbin
/sbin
/var/spool/mail
查找以0开头进行输出具体列。
[root@localhost ~]# awk '$4~/^0/ {print $1,$3,$5,$7}' passwd | column -t
root 0 root /bin/bash
sync 5 sync /bin/sync
shutdown 6 shutdown /sbin/shutdown
halt 7 halt /sbin/halt
$4~/^0/ ~表示包含和匹配
取反表示不包含41的行、列的参数
[root@localhost ~]# awk '$4~!/^0/ {print $1,$3,$5,$7}' passwd | column -t
bin 1 bin /sbin/nologin
mail 8 mail /sbin/nologin
!表示取反
查找以n和h结尾的行的具体列的参数
(1)
[root@localhost ~]# awk '$7~/(n|h)$/ {print $1,$3,$5,$7}' passwd | column -t
root 0 root /bin/bash
bin 1 bin /sbin/nologin
daemon 2 daemon /sbin/nologin
adm 3 adm /sbin/nologin
lp 4 lp /sbin/nologin
shutdown 6 shutdown /sbin/shutdown
mail 8 mail /sbin/nologin
(2)
[root@localhost ~]# awk '$7~/[nh]$/ {print $1,$3,$5,$7}' passwd | column -t
root 0 root /bin/bash
bin 1 bin /sbin/nologin
daemon 2 daemon /sbin/nologin
adm 3 adm /sbin/nologin
lp 4 lp /sbin/nologin
shutdown 6 shutdown /sbin/shutdown
mail 8 mail /sbin/nologin
将passwd中的sbin换成bin并输出
[root@localhost ~]# awk '{gsub (/sbin/,"bin",$6);print $6}' passwd
/root
/bin
/bin
/var/adm
/var/spool/lpd
/bin
/bin
/bin
/var/spool/mail
显示第二行之后的行
[root@localhost ~]# awk 'NR>2 {print}' 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
shutdown x 6 0 shutdown /sbin /sbin/shutdown
halt x 7 0 halt /sbin /sbin/halt
mail x 8 12 mail /var/spool/mail /sbin/nologin
范围模式
,显示2-5行的内容
[root@localhost ~]# awk 'NR==2,NR==5 {print}' 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
;显示第2行和第5行的内容
[root@localhost ~]# awk 'NR==2;NR==5 {print}' passwd
bin x 1 1 bin /bin /sbin/nologin
lp x 4 7 lp /var/spool/lpd /sbin/nologin
[root@localhost ~]# awk 'gsub(/root/,"bin",$0)' passwd $0表示所有列
bin x 0 0 bin /bin /bin/bash
[root@localhost ~]# awk 'gsub(/(sbin|bin)/,"ABCD",$0)' passwd 将多个字符转换成ABCD
root x 0 0 root /root /ABCD/bash
ABCD x 1 1 ABCD /ABCD /ABCD/nologin
daemon x 2 2 daemon /ABCD /ABCD/nologin
adm x 3 4 adm /var/adm /ABCD/nologin
lp x 4 7 lp /var/spool/lpd /ABCD/nologin
sync x 5 0 sync /ABCD /ABCD/sync
shutdown x 6 0 shutdown /ABCD /ABCD/shutdown
halt x 7 0 halt /ABCD /ABCD/halt
mail x 8 12 mail /var/spool/mail /ABCD/nologin
将/etc/passwd中的:更改为空格符号 并输出 \:进行转义
[root@localhost ~]# awk '{gsub(/\:/," ",$1);print $1}' /etc/passwd
NR==行信息 (第几行)
$NF== number filed (字段) ---列信息 (默认最后一列)
在没有使用-F指定分隔符信息时,默认awk用空格进行分割列,并且多个空格信息默认看成一个整体
特殊模式:
BEGIN;在文件处理之前,做出相应操作
END;在文件处理之后,做出相应操作
FS指定分隔符信息
[root@localhost ~]# awk 'BEGIN{print "oldboy"}NR==2;NR==5 {print} END{print"youngboy"}' passwd
oldboy
bin x 1 1 bin /bin /sbin/nologin
lp x 4 7 lp /var/spool/lpd /sbin/nologin
youngboy
[root@localhost ~]# awk 'BEGIN {print 5+4}'
9
[root@localhost ~]# awk 'BEGIN {print 5*4}'
20
print $i没有值输出 print i 有值输出。print "i" 直接输出i字符,print 1234 直接输出字符串
[root@localhost ~]# awk '/^$/{i=i+1;print $i}' passwd
[root@localhost ~]# awk '/^$/{i=i+1;print i}' passwd
1
2
3
[root@localhost ~]# awk '/^$/{i=i+1;print "i"}' passwd
i
i
i
[root@localhost ~]# awk '/^$/{i=i+1;print 1234}' passwd
1234
1234
1234
说明: 在AWK中调取变量信息,可以直接调取,不需要加$符号,加入$符号表示取列的信息
显示第三个/符号之前的列内容
[root@localhost ~]# awk -F "[/]+" '{print $3}' passwd OR
[root@localhost ~]# awk 'BEGIN{FS="/"};{print $1}' passwd 效果一致
bin
sbin
sbin
adm
spool
bin
sbin
sbin
spool
以下三者等价
[root@localhost ~]# awk 'BEGIN{FS="[/]+"};{print $1}' passwd
root x 0 0 root
bin x 1 1 bin
daemon x 2 2 daemon
adm x 3 4 adm
lp x 4 7 lp
sync x 5 0 sync
shutdown x 6 0 shutdown
halt x 7 0 halt
mail x 8 12 mail
[root@localhost ~]# awk -F "[ /]+" '{print $1}' passwd
root x 0 0 root
bin x 1 1 bin
daemon x 2 2 daemon
adm x 3 4 adm
lp x 4 7 lp
sync x 5 0 sync
shutdown x 6 0 shutdown
halt x 7 0 halt
mail x 8 12 mail
[root@localhost ~]# awk -vFS="/" '{print $1}' passwd
root x 0 0 root
bin x 1 1 bin
daemon x 2 2 daemon
adm x 3 4 adm
lp x 4 7 lp
sync x 5 0 sync
shutdown x 6 0 shutdown
halt x 7 0 halt
mail x 8 12 mail
赋予zpq变量,然后在打印出来
[root@localhost ~]# awk -vzpq=123 'BEGIN{print zpq}'
123
匹配任意内容和空行则加1,然后输出
[root@localhost ~]# awk '/.|^$/{i++} END{print i}' passwd
12
公式求和
[root@localhost ~]# seq 10 | awk '{i=i+$1} {print i}'
1
3
6
10
15
21
28
36
45
55
[root@localhost ~]# seq 0 5 100 0-100之间5的倍数
数组的组成部分:
zpq[01]=0101
名称[元素名称]=元素信息
zpq[02]=0202
zpq[03]=0303
定义数组,输出数组
[root@localhost ~]# awk 'BEGIN{zpq[01]="0101";print zpq[01]}'
0101
[root@localhost ~]# awk 'BEGIN{zpq[01]="123";zpq[02]="234";print zpq[01],zpq[02]}'
123 234