正则表达式下

9.4/9.5 sed

9.6/9.7 awk

以下内容为扩展部分

 

打印某行到某行之间的内容http://ask.apelearn.com/question/559

sed转换大小写 http://ask.apelearn.com/question/7758

sed在某一行最后添加一个数字http://ask.apelearn.com/question/288

删除某行到最后一行 http://ask.apelearn.com/question/213

打印1到100行含某个字符串的行 http://ask.apelearn.com/question/1048

awk 中使用外部shell变量http://ask.apelearn.com/question/199

awk 合并一个文件 http://ask.apelearn.com/question/493

把一个文件多行连接成一行 http://ask.apelearn.com/question/266

awk中gsub函数的使用 http://ask.apelearn.com/question/200

awk 截取指定多个域为一行 http://ask.apelearn.com/question/224

过滤两个或多个关键词 http://ask.apelearn.com/question/198

用awk生成以下结构文件 http://ask.apelearn.com/question/5494

awk用print打印单引号 http://ask.apelearn.com/question/1738

合并两个文件 http://ask.apelearn.com/question/945

awk的BEGIN和END http://blog.51cto.com/151wqooo/1309851

awk的参考教程 http://www.cnblogs.com/emanlee/p/3327576.html

awk语法结构:
awk -F ':' 'BEGIN{语句} {if(条件){语句1;语句2;语句3} } END{语句}' filename

打印某行到某行之间的内容
sed -n '/tss/,/sas/p' /etc/passwd

sed转换大小写
1. 把每个单词的第一个小写字母变大写:
sed 's/\b[a-z]/\u&/g' filename
2. 把所有小写变大写:
sed 's/[a-z]/\u&/g' filename
3. 大写变小写:
sed 's/[A-Z]/\l&/g' filename

sed在某一行最后添加一个数字
sed -r 's/(^a.*)/\1 12/' test
sed -r 's/^a.*/& 12/' test

打印1到100行含某个字符串的行
sed -n '1,100{/abc/p}' 1.txt

awk 中使用外部shell变量
a=2; echo "a:b:c:d"|awk -F ":" -v get_a=$a '{print $get_a}'

awk 合并一个文件

awk 'NR==FNR {a[$1]=$2} NR>FNR {print $0,a[$1]}' 1.txt 2.txt

说明:
awk '{print NR,FNR}' 1.txt 2.txt //首先理解NR和FNR的不同(awk支持同时操作多个文件内容)
当NR==FNR其实就是第一个文件的内容
当NR>FNR,其实就是第二个文件的内容

把一个文件多行连接成一行
方法一:
a=`cat file`;echo $a 
方法二:
awk '{printf("%s ",$0)}' file
方法三:
cat file |xargs

awk中gsub函数的使用 
awk 'gsub(/www/,"abc")' /etc/passwd // passwd文件中把所有www替换为abc
awk -F ':' 'gsub(/www/,"abc",$1) {print $0}' /etc/passwd // 替换$1中的www为abc

awk 截取指定多个域为一行 
用awk指定分隔符把文本分为若干段。如何把相同段的内容弄到一行?
以/etc/passwd为例,该文件以":"作为分隔符,分为了7段。
for i in `seq 1 7`
do
awk -F ':' -v a=$i '{printf $a " "}' /etc/passwd
echo 
done

过滤两个或多个关键词
grep -E '123|abc' filename // 找出文件(filename)中包含123或者包含abc的行
egrep '123|abc' filename //用egrep同样可以实现
awk '/123|abc/' filename // awk 的实现方式

awk用print打印单引号 
awk 'BEGIN{print "a'"'"'s"}'
awk 'BEGIN{print "a'\''s"}'
awk 'BEGIN{print "a\"s"}'

 

9.4/9.5 sed

  • sed命令比grep更强大,除了拥有查找功能外,还拥有替换功能

  • sed命令格式:sed -n 'n'p filename ,单引号内的n是数字,表示第几行;

  • sed 可以实现grep的大部分功能 ,但是不显示颜色

  • sed -n 是打印符合条件的行,p是print打印的意思

  • sed -r 脱义(去除特殊符号本身的意义,使其代表特殊意义)

  • sed -e 进行多次命令,和;效果一行

  • sed '/[0-9]'d 2.txt d表示删除不包含数字的行;不是真正的删除,是不显示,相当于grep -v 取反

  • sed -n '/root/'Ip I 不区分大小写

  • sed -i ' [0-9]'d 2.txt -i 是真正删除掉文档里面不包含数字的行;一半不建议使用。

  • 正则中 | 表示或者,并且要sed两次表示

  • sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' 1.txt 以:为分割符,将第一段和最后一段互相替换,\1表示第一个()内容,\2表示第二个()内容,\3表示第三个内容。

  • sed -r 's/(.*)/aaa:&/g' 1.txt

sed实例1:

  • sed -n '5'p test.txt
  • sed -n '1,5'p test.txt
  • sed -n '1,$'p test.txt
  • sed -n '/root/'p test.txt
  • sed -n '/^1/'p test.txt
  • sed -n 'in$'p test.txt
  • sed -n '/r..o/'p test.txt
  • sed -n 'oo*'p test.txt
  • sed -e '1'p -e '/111/'p -n test.txt

查找指定行

  1. 打印第5行;
[[email protected] ~]# sed -n '5'p 1.txt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  1. 打印第1-5行;
[[email protected] ~]# sed -n '1,5'p 1.txt
roooot: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
  1. 打印全部内容可以用(1,$)表示;内容太多,就不显示全部内容。
[[email protected] ~]# sed -n '1,$'p 1.txt
roooot:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
…
…
user6:x:1008:1003::/home/wuzhou:/sbin/nologin
user7:x:1009:1009::/home/user7:/bin/bash

查找指定字符串的行

  1. 查找带有root字符的行;字符要用/ /括起来。
[[email protected] ~]# sed -n '/root/'p 1.txt
roooot:x:0:0:root:/root:/bin/bash
  • 查询的内容也可以是正则;
  1. 查找以l开头的行
[[email protected] ~]# sed -n '/^l/'p 1.txt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  1. 查找以/login结尾的行;注意:这里需要将/login前面的/脱意一下。
[[email protected] ~]# sed -n '/\/login$/'p 1.txt
user5:x:1007:1006::/home/user5:/bin/login
  1. 查找包含r.o
[[email protected] ~]# sed -n '/r.o/'p 1.txt
roooot:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/rooot:/sbin/nologin
  1. 打印带有数字的行
[[email protected] ~]# cat 3.txt
121212
ababab
[[email protected] ~]# sed -n '/[0-9]/'p 3.txt
121212

  1. 打印以数字开头的行
[[email protected] ~]# sed -n '/^[0-9]/'p 1.txt
1111bbaavv

  1. sed –e 可以进行多次命令;
[[email protected] ~]# sed -e '1'p -e '/111/'p -n 1.txt
roooot:x:0:0:root:/root:/bin/bash
1111bbaavv

删除某些行

sed实例2:

  • sed '1'd test.txt
  • sed '1,3'd test.txt
  • sed '/oot/'d test.txt
  1. 删除第1行
[[email protected] ~]# cat 3.txt
121212
ababab
dfbnsofvas
sdg1wasdf2
!#[email protected]!##[email protected]#
[[email protected] ~]# sed '1'd 3.txt
ababab
dfbnsofvas
sdg1wasdf2
!#[email protected]!##[email protected]#

  1. 删除第1-3行
[[email protected] ~]# cat 3.txt
121212
ababab
dfbnsofvas
sdg1wasdf2
[[email protected] ~]# sed '1,3'd 3.txt
sdg1wasdf2
!#[email protected]!##[email protected]#

  1. 删除带有ab字符的行
[[email protected] ~]# cat 3.txt
121212
ababab
dfbnsofvas
sdg1wasdf2
[[email protected] ~]# sed '/ab/'d 3.txt
121212
dfbnsofvas
sdg1wasdf2
!#[email protected]!##[email protected]#

sed替换功能

  • sed 's/[0-9]/a/g' 1.txt //将所有数字替换成a
  • sed 's/root/ROOT/g' 1.txt //将文件1.txt中root全部换成ROOT
  • sed '1,10s/root/ROOT/g' 1.txt //将文件1.txt前10行中root全部替换成ROOT
  • paste 1.txt 2.txt //将1.txt的内容和2.txt内容连在一起
  • sed -i '30,40s/^.*$/#&/g' 1.txt //前面加入加上#注释掉
  • sed -i 's/^/#/g' 1.txt //前面加入加上#注释掉
  • s 是替换的意思,g为全局替换,否者就替换一次,/可以用#@来替换字符

sed实例3:

  • sed '1,2s/ot/to/g' test.txt
  • sed 's#ot#to#g' test.txt
  • sed 's/[0-9]//g' test.txt
  • sed 's/[a-zA-Z]//g' test.txt
  • sed -r 's/(rot)(.*)(bash)/\3\2\1/' test.txt
  • sed 's/^.*$/123&/' test.txt
  • sed -i 's/ot/to/g' test.txt
  1. 将1到2行中ot替换成to
[[email protected] ~]# head -5 1.txt|sed '1,2s/ot/to/'g
roooto:x:0:0:roto:/roto:/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
  1. /可以用#或者@来替换
[[email protected] ~]# head -5 1.txt|sed '1,2s#ot#to#'g
roooto:x:0:0:roto:/roto:/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
  1. 将数字全部删除
[[email protected] ~]# head -5 1.txt|sed 's/[0-9]//'g
roooot:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
lp:x:::lp:/var/spool/lpd:/sbin/nologin

  1. 只保留数字
[[email protected] ~]# head -5 1.txt|sed 's/[^0-9]//'g
00
11
22
34
47

  1. 删除所有字母
[[email protected] ~]# head -5 1.txt|sed 's/[a-zA-Z]//'g
::0:0::/://
::1:1::/://
::2:2::/://
::3:4:://://
::4:7::///://

  1. 以:为分割,将第一段和最后一段调换位置;+ 在里面是特殊符号,要脱意 用 -r
[[email protected] ~]# head -5 1.txt|sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/'g
/bin/bash:x:0:0:root:/root:roooot
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon
/sbin/nologin:x:3:4:adm:/var/adm:adm
/sbin/nologin:x:4:7:lp:/var/spool/lpd:lp

正则表达式下

  1. ;分号可以进行多次匹配
[[email protected] ~]# sed -n '/root/p;/user5/p' 1.txt
roooot:x:0:0:root:/root:/bin/bash
user5:x:1007:1006::/home/user5:/bin/login
  1. -e 进行多次命令,和;效果一行
[[email protected] ~]# sed -n -r -e '/root/'p -e '/user5/'p  1.txt
roooot:x:0:0:root:/root:/bin/bash
user5:x:1007:1006::/home/user5:/bin/login
  1. 在每一行前面加上aaa: &表示前面()的内容
[[email protected] ~]# head -5 1.txt|sed -r 's/(.*)/aaa:&/g'
aaa:roooot:x:0:0:root:/root:/bin/bash
aaa:bin:x:1:1:bin:/bin:/sbin/nologin
aaa:daemon:x:2:2:daemon:/sbin:/sbin/nologin
aaa:adm:x:3:4:adm:/var/adm:/sbin/nologin
aaa:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

\1 表示前面()的内容

[[email protected] ~]# head -5 1.txt|sed -r 's/(.*)/aaa:\1/g'
aaa:roooot:x:0:0:root:/root:/bin/bash
aaa:bin:x:1:1:bin:/bin:/sbin/nologin
aaa:daemon:x:2:2:daemon:/sbin:/sbin/nologin
aaa:adm:x:3:4:adm:/var/adm:/sbin/nologin
aaa:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

  1. -i 会直接更改文件本身的内容
sed -i 's/^/#/g' 3.txt
[[email protected] ~]# sed -i 's/^/#/g' 3.txt
[[email protected] ~]# cat 3.txt
#121212
#ababab
#dfbnsofvas
#sdg1wasdf2
#!#[email protected]!##[email protected]#

9.6/9.7 awk

  • awk也是流式编辑器,针对文档中的行和段进行操作 awk可以分为几个部分:
  • 匹配字符或者字符串
  • 截取文档中的某一段
  • 条件操作符
  • 数学运算
  • 内置变量

实例1:

  • head -n2 test.txt|awk -F ':' '{print $1}'
  • head -n2 test.txt|awk -F ':' '{print $0}'
  • awk -F ':' '{print $1"#"$2"#"$3"#"$4}'
  • awk '/oo/' test.txt
  • awk -F ':' '$1 ~/oo/' test.txt
  • awk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3}' test.txt
  • awk -F ':' '$3=="0"' /etc/passwd
  • awk -F ':' '$3>="500"' /etc/passwd
  • awk -F ':' '$3>=500' /etc/passwd
  • awk -F ':' '$7!="/sbin/nologin"' /etc/passwd

匹配字符或者字符串

匹配root的行

[[email protected] ~]# awk '/root/' 1.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

 awk可以做到匹配某一段中的某个字符,以:分隔,匹配第一段中带有root的行

[[email protected] ~]# awk -F ':' '$1 ~ /root/' 1.txt
root:x:0:0:root:/root:/bin/bash

awk匹配字符可以使用正则

[[email protected] ~]# awk '/ooo?/' 1.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin

awk自带脱意功能,grep脱意需要-E或者egrep,sed脱意需要-r选项

[[email protected] ~]# awk -F ':' '/oo+/' 1.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin

grep -E

[[email protected] ~]# grep -E 'oo+' 1.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin

sed –r

[[email protected] ~]# sed -n -r '/oo+/'p 1.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin

截取文档中的某一段

  • awk –F '分隔符' 如果不指定分隔符,默认会以空格或者空白字符分隔。

打印第一段

[[email protected] ~]# head -5 1.txt |awk -F ':' '{print $1}'
root
bin
daemon
adm
lp

打印全部内容;$0表示全部内容

[[email protected] ~]# head -5 1.txt |awk -F ':' '{print $0}'
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

打印第1段~第4段

[[email protected] ~]# head -5 1.txt |awk -F ':' '{print $1,$2,$3,$4}'
root x 0 0
bin x 1 1
daemon x 2 2
adm x 3 4
lp x 4 7 
  • 注意:这里打印出来了第1到第4段,但是内容没有分隔符,这里我们加个分隔符,分隔符要以双引号引起来;后面我们会介绍一个变量OFS来进行分隔。
[[email protected] ~]# head -5 1.txt |awk -F ':' '{print $1"#"$2"#"$3"#"$4}'
root#x#0#0
bin#x#1#1
daemon#x#2#2
adm#x#3#4
lp#x#4#7

  • awk可以支持多个匹配

匹配到root打印第1和第3段,匹配到user打印第1,第3,第4段。

[[email protected] ~]# awk -F ':' '/root/{print $1,$3} /user/ {print $1,$3,$4}' 1.txt
root 0
operator 11
tss 59 59
user3 1004 1003
user4 1005 1003
user5 1007 1006
user6 1008 1003
user7 1009 1009
  • |在正则里面表示或者

打印出匹配到root或者user的行

[[email protected] ~]# awk '/root|bash/' 1.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
lem:x:1000:1000::/home/lem:/bin/bash
user7:x:1009:1009::/home/user7:/bin/bash

||也是并且的意思,但是用法还是有一点区别。

[[email protected] ~]# awk '/root/||/bash/' 1.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
lem:x:1000:1000::/home/lem:/bin/bash
user7:x:1009:1009::/home/user7:/bin/bash

条件操作符

  • == 等于,精确匹配
  • >大于

  • >= 大于等于

  • < 小于
  • <= 小于等于
  • != 不等于

打印出第3段等于0的行

[[email protected] ~]# awk -F ':' '$3=='0'' 1.txt

打印出第3段大于等于500的行

[[email protected] ~]# awk -F ':' '$3>='500'' 1.txt
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin
lem:x:1000:1000::/home/lem:/bin/bash
user3:x:1004:1003::/home/user3:/sbin/nolongin
user4:x:1005:1003::/home/user4:/sbin/nolongin
user5:x:1007:1006::/home/user5:/bin/login
user6:x:1008:1003::/home/wuzhou:/sbin/nologin
user7:x:1009:1009::/home/user7:/bin/bash

注意'500'和"500"区别:双引号引起来的500会把它当成字符,会按照阿斯玛排序,单用号引起来的500是数字。

[[email protected] ~]# awk -F ':' '$3>="500"' 1.txt
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
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin

打印出第7段不/sbin/nologin的行

[[email protected] ~]# awk -F ':' '$7!="/sbin/nologin"' 1.txt
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
lem:x:1000:1000::/home/lem:/bin/bash
user3:x:1004:1003::/home/user3:/sbin/nolongin
user4:x:1005:1003::/home/user4:/sbin/nolongin
user5:x:1007:1006::/home/user5:/bin/login
user7:x:1009:1009::/home/user7:/bin/bash

并且&&和或者||

[[email protected] ~]# awk -F ':' '$3>'1000' && $3<'1009'' 1.txt
user3:x:1004:1003::/home/user3:/sbin/nolongin
user4:x:1005:1003::/home/user4:/sbin/nolongin
user5:x:1007:1006::/home/user5:/bin/login
user6:x:1008:1003::/home/wuzhou:/sbin/nologin

或者||

[[email protected] ~]# awk -F ':' '$3>'1000' || $7=="/bin/bash"' 1.txt
root:x:0:0:root:/root:/bin/bash
lem:x:1000:1000::/home/lem:/bin/bash
user3:x:1004:1003::/home/user3:/sbin/nolongin
user4:x:1005:1003::/home/user4:/sbin/nolongin
user5:x:1007:1006::/home/user5:/bin/login
user6:x:1008:1003::/home/lem:/sbin/nologin
user7:x:1009:1009::/home/user7:/bin/bash

两个字段进行运算

[[email protected] ~]# awk -F ':' '$3>$4' 1.txt
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin
user3:x:1004:1003::/home/user3:/sbin/nolongin
user4:x:1005:1003::/home/user4:/sbin/nolongin
user5:x:1007:1006::/home/user5:/bin/login
user6:x:1008:1003::/home/lem:/sbin/nologin

awk内置变量

  • awk常用的变量有OFS,NR和NF
  • OFS 用来指定分隔符号
  • NR 表示行数
  • NF 表示段数

指定#为分隔符

[[email protected] ~]# awk -F ':' '{OFS="#"} $3>"5" {print $1,$2,$3,$4}' 1.txt
shutdown#x#6#0
halt#x#7#0
mail#x#8#12
nobody#x#99#99
systemd-bus-proxy#x#999#997
dbus#x#81#81
polkitd#x#998#996
tss#x#59#59
postfix#x#89#89
sshd#x#74#74
chrony#x#997#995

用awk打印前5行,并显示行号

[[email protected] ~]# head -5 1.txt|awk -F ':' '{print NR":"$0}'
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

用awk打印20行以后的行,并显示行号

[[email protected] ~]# awk -F ':' 'NR>20 {print NR":"$0}' 1.txt
21:chrony:x:997:995::/var/lib/chrony:/sbin/nologin
22:lem:x:1000:1000::/home/lem:/bin/bash
23:user3:x:1004:1003::/home/user3:/sbin/nolongin
24:user4:x:1005:1003::/home/user4:/sbin/nolongin
25:user5:x:1007:1006::/home/user5:/bin/login
26:user6:x:1008:1003::/home/lem:/sbin/nologin
27:user7:x:1009:1009::/home/user7:/bin/bash

awk中可以使用if判断

[[email protected] ~]# awk -F ':' '{OFS="#"} {if($3>'1000'){print $1,$2,$3}}' 1.txt
user3#x#1004
user4#x#1005
user5#x#1007
user6#x#1008
user7#x#1009

awk中的数学运算

  • awk可以更改段值

将第一段全部更改为root

[[email protected] ~]# head -5 1.txt|awk -F ':' '$1="root"'
root x 0 0 root /root /bin/bash
root x 1 1 bin /bin /sbin/nologin
root x 2 2 daemon /sbin /sbin/nologin
root x 3 4 adm /var/adm /sbin/nologin
root x 4 7 lp /var/spool/lpd /sbin/nologin
  • awk可以计算某个段的值

求第3段和

[[email protected] ~]# awk -F ':' '{(oto=oto+$3)}; END {print oto}' 1.txt
9694

打印出第一段是root的行

[[email protected] ~]# awk -F ':' '{if ($1=="root") {print $0}}' 1.txt
root:x:0:0:root:/root:/bin/bash