最全的三剑客和linux正则符号讲解
2.6.5 awk之BEGIN和END模块用法的讲解 244
第2章 linux符号系列与三剑客
2.1 特殊符号系列
2.1.1 普通符号系列
2.1.1.1 # 符号
1.代表注释
[root@oldboy6666 regular] # cat oldboy.txt
I am oldboy teacher!
#I teach linux.
I like badminton ball ,billiard ball and chinese chess!
2.代表用户的权限(root用户)
[root@oldboy6666 regular] # whoami
root
[root@oldboy6666 regular] #
2.1.1.2 $ 符号
1.代表用户的权限(普通用户)
[root@oldboy6666 regular] # su - oldboy01
[oldboy01@oldboy6666 ~] $ whoami
oldboy01
[oldboy01@oldboy6666 ~] $
2.代表调用的变量
[oldboy01@oldboy6666 ~] $ oldboy=123
[oldboy01@oldboy6666 ~] $ echo $oldboy
123
[oldboy01@oldboy6666 ~] $
3.代表获取列的信息
[root@oldboy6666 regular] # ip a | awk '{print $2}'
lo:
00:00:00:00:00:00
127.0.0.1/8
forever
::1/128
forever
eth0:
00:0c:29:16:07:30
10.0.0.200/24
forever
fe80::b736:dc22:2ec6:1b47/64
forever
[root@oldboy6666 regular] #
4.$符号代表一行的结尾,(使用cat -A)来代表
[root@oldboy6666 oldboy] # cat -A /oldboy/1.txt
123456$
[root@oldboy6666 oldboy] #
2.1.1.3 ! 符号
1.表示取反的操作
[root@oldboy6666 regular] # find /etc ! -path /etc/sysconfig
/etc/httpd/logs
/etc/httpd/modules
/etc/httpd/run
/etc/trusted-key.key
/etc/wgetrc
/etc/updatedb.conf
2.表示强制的操作
oldboy01:x:1000:1000::/home/oldboy01:/bin/bash
~
:wq!
3.表示调取历史命令的操作
[root@oldboy6666 regular] # history
1200 find /etc -path /etc/sysconfig
1201 find /etc ! -path /etc/sysconfig
1202 ls
1203 history
[root@oldboy6666 regular] # !1202
ls
oldboy.txt
[root@oldboy6666 regular] #
2.1.1.4 | 符号
将前一个命令执行的结果,交给后面命令处理
[root@oldboy6666 regular] # ps -ef | grep httpd
root 9141 7340 0 10:11 pts/0 00:00:00 grep --color=auto httpd
[root@oldboy6666 regular] #
2.1.2 引号符号系列
2.1.2.1 "" 符号
引号里面的特殊字符会进行解析
[root@oldboy6666 regular] # a=4
[root@oldboy6666 regular] # b="$a 4"
[root@oldboy6666 regular] # echo $b
4 4
2.1.2.2 '' 符号
即所见即所得
[root@oldboy6666 regular] # a=4
[root@oldboy6666 regular] # b='$a 4'
[root@oldboy6666 regular] # echo $b
$a 4
[root@oldboy6666 regular] #
2.1.2.3 `` 符号
将命令执行的结果交给外面的命令来处理,相当于$()
lujing=`find /oldboy -type f -name "oldboy*"` && echo $lujing | xargs cat | xargs |xargs -i sed 's#{}#oldboy#g' $lujing
2.1.2.4 没有符号
没有符号和""差不多,有区别的是可以生成数列
[root@oldboy6666 regular] # echo {1..10}
1 2 3 4 5 6 7 8 9 10
[root@oldboy6666 regular] #
2.1.3 定向符号
2.1.3.1 > 符号
标准输出重定向符号
[root@oldboy6666 regular] # echo {1..10} > 1.txt
[root@oldboy6666 regular] # cat 1.txt
1 2 3 4 5 6 7 8 9 10
[root@oldboy6666 regular] #
2.1.3.2 >> 符号
标准输出追加重定向
[root@oldboy6666 regular] # echo {1..20} >> 1.txt
[root@oldboy6666 regular] # cat 1.txt
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
[root@oldboy6666 regular] #
2.1.3.3 < 符号
标准输入重定向
[root@oldboy6666 regular] # cat < 1.txt
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
[root@oldboy6666 regular] #
2.1.3.4 << 符号
[root@oldboy6666 regular] # cat >> 1.txt <<EOF
> ASDFGH
> EOF
[root@oldboy6666 regular] # cat 1.txt
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
ASDFGH
[root@oldboy6666 regular] #
2.1.3.5 2> 符号
[root@oldboy6666 regular] # ech aa 2> error.log
[root@oldboy6666 regular] # cat error.log
-bash: ech: command not found
[root@oldboy6666 regular] #
2.1.3.6 2>> 符号
[root@oldboy6666 regular] # lll aaa 2>> error.log
[root@oldboy6666 regular] # cat error.log
-bash: ech: command not found
-bash: lll: command not found
[root@oldboy6666 regular] #
2.1.3.7 2>&1 符号
[root@oldboy6666 regular] # ls * ;lllll bbb > error.log 2>&1
1.txt error.log oldboy.txt
[root@oldboy6666 regular] # cat error.log
-bash: lllll: command not found
2.1.3.8 &> 符号
[root@oldboy6666 regular] # ls aa &>error.log
[root@oldboy6666 regular] # ls * &>error.log
[root@oldboy6666 regular] # ls aa &>>error.log
[root@oldboy6666 regular] # cat error.log
1.txt
error.log
oldboy.txt
ls: cannot access aa: No such file or directory
[root@oldboy6666 regular] #
2.1.4 路径符号
2.1.4.1 . 符号
当前目录
2.1.4.2 .. 符号
上一级目录
2.1.4.3 ../.. 符号
上2级目录
2.1.4.4 - 符号
切换到上一次所在的目录($OLDPWD)
2.1.4.5 ~ 符号
切换到家目录
2.1.5 逻辑符号
2.1.5.1 && 符号
前面的执行成功,才会执行后面的
[root@oldboy6666 regular] # echo 22 && echo 111
22
111
[root@oldboy6666 regular] # ech 22 && echo 111
-bash: ech: command not found
[root@oldboy6666 regular] #
2.1.5.2 || 符号
前面的执行成功,就不会执行后面的,前面的如果没有执行成功,才会执行后面的
[root@oldboy6666 regular] # echo 22 || echo 111
22
[root@oldboy6666 regular] # ech 22 || echo 111
-bash: ech: command not found
111
[root@oldboy6666 regular] #
2.2 通配符号系列(文件名称查找)
2.2.1 * 符号
*匹配所有的字符
2.2.1.1 查找出以.txt结尾的信息
[root@oldboy6666 regular] # find ./ -name "*.txt"
./oldboy.txt
./1.txt
[root@oldboy6666 regular] #
*:可以进行操作管理数据
2.2.1.2 删除*.txt结尾的文件
[root@oldboy6666 oldboy02] # ls
oldboy01.txt oldboy02.txt oldboy03.txt oldboy04.txt oldboy05.txt oldboy06.txt oldboy07.txt oldboy08.txt oldboy09.txt oldboy10.txt
[root@oldboy6666 oldboy02] # rm -rf *.txt
[root@oldboy6666 oldboy02] # ll
total 0
[root@oldboy6666 oldboy02] #
2.2.2 {} 符号
2.2.2.1 数字序列
[root@oldboy6666 regular] # echo {01..10}
01 02 03 04 05 06 07 08 09 10
2.2.2.2字母序列
[root@oldboy6666 regular] # echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@oldboy6666 regular] #
- 组合序列
2.2.2.3.1 {a..z}{1..3}进行组合
[root@oldboy6666 regular] # echo {a..z}{1..3}
a1 a2 a3 b1 b2 b3 c1 c2 c3 d1 d2 d3 e1 e2 e3 f1 f2 f3 g1 g2 g3 h1 h2 h3 i1 i2 i3 j1 j2 j3 k1 k2 k3 l1 l2 l3 m1 m2 m3 n1 n2 n3 o1 o2 o3 p1 p2 p3 q1 q2 q3 r1 r2 r3 s1 s2 s3 t1 t2 t3 u1 u2 u3 v1 v2 v3 w1 w2 w3 x1 x2 x3 y1 y2 y3 z1 z2 z3
[root@oldboy6666 regular] #
2.2.2.3.2 复制命令
[root@oldboy6666 regular] # cp -rf 1.txt{,.ori}
[root@oldboy6666 regular] # ls
- sh 1.txt 1.txt.ori error.log oldboy.txt
2.2.2.3.3 备份源文件
[root@oldboy6666 regular] # cp -rf 1.txt{.ori,}
[root@oldboy6666 regular] # ls
1.sh 1.txt 1.txt.ori error.log oldboy.txt
[root@oldboy6666 regular] #
2.3 正则符号系列(按文件内容查找)
2.3.1 普通正则符号
2.3.1.1 ^ 符号
^ 以什么什么开头
2.3.1.1.1 匹配出以"m"开头的信息
[root@oldboy6666 regular] # ls
oldboy.txt
[root@oldboy6666 regular] # grep "^m" ./oldboy.txt 以"m"开头的文件
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!
[root@oldboy6666 regular] #
2.3.1.2 $ 符号
$ 以什么什么结尾
2.3.1.2.1 匹配出以m结尾的行
[root@oldboy6666 regular] # grep "m$" ./oldboy.txt 以"m"结尾的行
my blog is http://oldboy.blog.51cto.com
my blog is http://oldboy.blog.51cto.com
[root@oldboy6666 regular] #
2.3.1.3 * 符号(一行一行匹配)
* 匹配前面一个字符0次或者n次
2.3.1.3.1 匹配出"o"出现的次数
[root@oldboy6666 regular] # grep "0*" ./oldboy.txt 查找"0"出现0次或者n次
I am oldboy teacher!
#I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is 0 http://www.etiantian.org
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[root@oldboyedu oldboy]# egrep "(old)" oldboy.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!
[root@oldboy6666 regular] #
2.3.1.3.2 匹配出以"I"开头,"o"结尾的信息
发现*匹配的时候具有贪婪个性
[root@oldboy6666 ~] # grep "I.*o" /oldboy/oldboy.txt
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
[root@oldboy6666 ~] #
2.3.1.4 . 符号(单个字符进行匹配)
. 匹配任意一个字符(不匹配空行)
"
[root@oldboy6666 regular] # grep "0." ./oldboy.txt 出现0任意一次
our site is 0 http://www.etiantian.org
not 4900000448.
[root@oldboy6666 regular] #
2.3.1.5 [] 符号
[]匹配方括号中多个任意一个字符
2.3.1.5.1 匹配a-z字母中任意一个字符
[root@oldboy6666 regular] # grep "[a-Z]" ./oldboy.txt 匹配a-Z字母中的任意一个字符
I am oldboy teacher!
#I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is 0 http://www.etiantian.org
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[root@oldboyedu oldboy]# egrep "(old)" oldboy.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!
2.3.1.6 [^] 符号
[^] 取[]任意字符的相反
2.3.1.6.1 匹配a-Z以外的所有字符
[root@oldboy6666 regular] # grep "[^a-Z]" ./oldboy.txt 匹配[a-Z]以外的所有字符
I am oldboy teacher!
#I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is 0 http://www.etiantian.org
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[root@oldboyedu oldboy]# egrep "(old)" oldboy.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!
[root@oldboy6666 regular] #
2.3.1.7 ^$ 符号
查找空行的信息
2.3.1.7.1 查找空行信息
[root@oldboy6666 oldboy] # grep "^$" 2.txt
[root@oldboy6666 oldboy] #
2.3.1.8 .* 符号
匹配任意数
2.3.1.8.1 查找任意字符
[root@oldboy6666 oldboy] # grep ".*" 2.txt
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is 0 http://www.etiantian.org
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[root@oldboy6666 oldboy] #
匹配以I开头,o结尾
[root@oldboy6666 oldboy] # grep 'I.*o' oldboy.txt
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
[root@oldboy6666 oldboy] #
2.3.1.9 \ 字符
2.3.1.9.1 将有意义的字符变的没意义
[root@oldboy6666 oldboy] # grep "(oldboy)" 2.txt 错误的
[root@oldboy6666 oldboy] # grep "\(oldboy\)" 2.txt 正确的
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
[root@oldboy6666 oldboy] #
2.3.1.9.2 将没意义的字符变的有意义(\n) \t代表制表符(tab)
[root@oldboy6666 oldboy] # echo OldboyOlbgirl
OldboyOlbgirl
[root@oldboy6666 oldboy] # echo -e "Oldboy\nOlbgirl"
Oldboy
Olbgirl
[root@oldboy6666 oldboy] #
将别名中的别名取消
2.3.2 扩展正则符号
2.3.2.1 + 符号
+ 匹配前面的字符1次或者n次
次或者n次
[root@oldboy6666 regular] # grep -E "([o]+)" 1.txt 匹配"o"1次或者n次
god
good
goood
gooood
goooood
[root@oldboy6666 regular] #
2.3.2.2 ? 符号
?:匹配一个字符出现0次或者1次
次或者1次
[root@oldboy6666 regular] # grep -E "[O]?" 1.txt 查找1.txt文件中"O"出现0次或者1次的行
gd
god
good
goood
gooood
goooood
[root@oldboy6666 regular] #
2.3.2.3 {} 符号
匹配一个字符出现的次数
次,最多n次
[root@oldboy6666 regular] # grep -E "[o]{3,}" 1.txt 匹配一个o最少出现3次
goood
gooood
goooood
[root@oldboy6666 regular] #
次最多3次
[root@oldboy6666 regular] # grep -E "[o]{2,3}" 1.txt 匹配一个o最少出现2次最多出现3次
good
goood
gooood
goooood
[root@oldboy6666 regular] #
次,最少0次
[root@oldboy6666 regular] # grep -E "[o]{,3}" 1.txt 匹配一个o最多3次,最少0次
gd
god
good
goood
gooood
goooood
[root@oldboy6666 regular] #
次
[root@oldboy6666 oldboy] # grep -E "[o]{3}" oldboy02.txt
goood
gooood
goooood
[root@oldboy6666 oldboy] #
2.3.2.4 () 符号
作为整合使用的
2.3.2.4.1 匹配"old"的字符
[root@oldboyedu oldboy]# egrep "(old)" oldboy.txt 匹配old的字符,必须同时拥有
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!
[root@oldboy6666 regular] #
可以实现后项引用前项
个用户,并且设置随机密码
[root@oldboy6666 scripts] # echo oldboy{01..10} | xargs -n 1 | sed -r 's#(.*)#useradd \1;PASSWD=$(echo $(tr -cd 'a-z\&\&0-9\&\&A-Z' </dev/urandom | head -c 5));echo $PASSWD | passwd --stdin \1 \&\& echo \1 $PASSWD >> /server/scripts/1.txt#g' | bash 创建10个用户,并且设置随机密码
Changing password for user oldboy01.
passwd: all authentication tokens updated successfully.
Changing password for user oldboy02.
passwd: all authentication tokens updated successfully.
Changing password for user oldboy03.
passwd: all authentication tokens updated successfully.
Changing password for user oldboy04.
passwd: all authentication tokens updated successfully.
Changing password for user oldboy05.
passwd: all authentication tokens updated successfully.
Changing password for user oldboy06.
passwd: all authentication tokens updated successfully.
Changing password for user oldboy07.
passwd: all authentication tokens updated successfully.
Changing password for user oldboy08.
passwd: all authentication tokens updated successfully.
Changing password for user oldboy09.
passwd: all authentication tokens updated successfully.
anging password for user oldboy10.
▽asswd: all authentication tokens updated successfully.
2.3.2.4.3 使用chpasswd命令来创建10个用户,并且设置随机密码
echo oldboy{01..10}|xargs -n1 useradd ;echo oldboy{01..10}:`tr -cd 'a-z0-9A-Z' </dev/urandom|head -c 6`|xargs -n1>> pass.txt|chpasswd
2.3.2.4.3 将/etc/passwd文件倒叙列出来
[root@oldboy6666 regular] # cat /etc/passwd | sed -r 's#([^:]+)(:.*:)(/.*$)#\3\2\1#g' 将/etc/passwd文件倒序列出来
/bin/bash:x:0:0:root:/root:root
/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
/bin/sync:x:5:0:sync:/sbin:sync
/sbin/shutdown:x:6:0:shutdown:/sbin:shutdown
/sbin/halt:x:7:0:halt:/sbin:halt
/sbin/nologin:x:8:12:mail:/var/spool/mail:mail
2.3.2.4.4 取出文件权限
[root@oldboy6666 oldboy] # stat /etc/hosts | sed -n 4p| grep -Eo "[0-9]{4}" 第一种
0644
[root@oldboy6666 oldboy] #
[root@oldboy6666 oldboy] # stat /etc/hosts |sed -rn '4s#^A.*: \((.*)/-.*#\1#gp' 第二种
0644
[root@oldboy6666 oldboy] #
2.3.2.5 | 符号
| 符号匹配多个字符串信息
2.3.2.5.1 查找有"g|o"的行
[root@oldboy6666 ~] # grep -E "g|o" /server/regular/1.txt 匹配文本里面有o或者g的行
gd
god
good
goood
gooood
goooood
[root@oldboy6666 ~] #
2.4 grep
2.4.1 grep地位和作用
grep是三剑客中的第3位,通常过滤一个文件或者标准输入
2.4.2 grep语法描述
grep [参数] [条件] [文件]
2.4.3 grep命令讲解
- grep +"遍历的条件" 文本 查看匹配的内容
- grep -c "遍历的条件" 文本 查看匹配的内容一共多少行
- grep -n "遍历的条件" 文本 查看匹配的文本内容并记录行号
- grep -v "遍历的条件" 文本 查看匹配的文本信息的相反内容
- grep -A 2 "遍历的条件" 文本 查看匹配文本信息前2行的内容
- grep -B 2 "遍历的条件" 文本 查看匹配文本信息后2行的内容
- grep -C 2 "遍历的条件" 文本 查看匹配内容的前后2行信息
- grep -i "遍历的条件" 文本 查看匹配内容信息,不区分大小写
- grep -r "遍历的条件" 目录 递归遍历目录中所有文本里面有 遍历条件的内容
- grep -o "遍历的条件" 文本 查看grep命令匹配条件的时候的过程(列出匹配的内容)
- grep -w "遍历的条件" 文本 查看匹配的文件会满足全行,不会进行单个匹配
扩展
- grep -q "遍历的条件" 文本 不查看匹配的内容是什么,经常配合echo命令来使用
- grep -a "遍历的条件" 文本 匹配二进制文件的时候像匹配文本信息一样
- grep -H "遍历的条件" 文本 匹配相应的文件内容,并且将条件所对应的文件显示出来
2.4.4 grep命令的详解
2.4.4.1 查找出文件有oldboy的信息
[root@oldboy6666 oldboy] # grep "oldboy" 2.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
2.4.4.2 查找出文件有oldboy的信息统计一共多少行
[root@oldboy6666 oldboy] # grep -c "oldboy" 2.txt
2
[root@oldboy6666 oldboy] #
2.4.4.3 查找出文件有oldboy的信息并且添加行号
[root@oldboy6666 oldboy] # grep -n "oldboy" 2.txt
1:I am oldboy teacher!
3:my blog is http://oldboy.blog.51cto.com
[root@oldboy6666 oldboy] #
2.4.4.4 查找出文件里没有oldboy的信息行
[root@oldboy6666 oldboy] # grep -v "oldboy" 2.txt
I like badminton ball ,billiard ball and chinese chess!
our site is 0 http://www.etiantian.org
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[root@oldboy6666 oldboy] #
2.4.4.5 查找出文件里有oldboy内容上2行的内容
[root@oldboy6666 oldboy] # grep -A 2 "oldboy" 2.txt
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is 0 http://www.etiantian.org
not 4900000448.
[root@oldboy6666 oldboy] #
2.4.4.6 查找出文件里有oldboy内容的后2行的内容
[root@oldboy6666 oldboy] # grep -B 2 "oldboy" 2.txt
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
[root@oldboy6666 oldboy] #
2.4.4.7 查找文件里有oldboy内容的上下2行内容
[root@oldboy6666 oldboy] # grep -A 2 -B 2 "oldboy" 2.txt 第一种办法
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is 0 http://www.etiantian.org
not 4900000448.
[root@oldboy6666 oldboy] # grep -C 2 "oldboy" 2.txt 第二种办法
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is 0 http://www.etiantian.org
not 4900000448.
[root@oldboy6666 oldboy] #
2.4.4.7 查找文件里面有oldboy的信息,并且不区分大小写
[root@oldboy6666 oldboy] # grep -i "oldboy" 2.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!
[root@oldboy6666 oldboy] #
2.4.4.8 查找身份证不符合信息的条件
[root@oldboy6666 oldboy] # cat oldboy01.txt
张三 110105199003046677
李四 120110199505067766
赵六 oldboy
王五 111112198804058666
王si 11111111111111111111111111111
[root@oldboy6666 oldboy] #
[root@oldboy6666 oldboy] # grep -Ewv "[0-9]{18}" oldboy01.txt
赵六 oldboy
王si 11111111111111111111111111111
[root@oldboy6666 oldboy] #
2.4.4.9 查找目录中每个文件里面有oldboy的信息
[root@oldboy6666 /] # grep -r "oldboy" /oldboy
/oldboy/oldboy.txt:I am oldboy teacher!
/oldboy/oldboy.txt:my blog is http://oldboy.blog.51cto.com
/oldboy/oldboy.txt:[root@oldboy6666 oldboy] #
/oldboy/oldboy01.txt:赵六 oldboy
/oldboy/oldboy02.txt:oldboy
[root@oldboy6666 /] #
2.4.4.10 匹配出网卡的IP
[root@oldboy6666 oldboy02] # ip a s eth0 | grep eth0$|grep -Eo "([0-9]{1,3}\.?){4}"
10.0.0.200
10.0.0.255
[root@oldboy6666 oldboy02] # ip a s eth0 | grep eth0$|grep -Eo "([0-9]{1,3}\.?){4}"| head -n1
10.0.0.200
[root@oldboy6666 oldboy02] #
2.5 sed
2.5.1 sed的地位和作用
sed是三剑客中的第2位,是流编辑软件,负责修改文件内容、处理文件行的操作
2.5.2 sed语法格式
sed 参数 [需要查找的条件][指令] 文件名称
2.5.3
原理讲解
2.5.3.1 sed执行过程原理的讲解
2.5.3.2 sed -i的执行原理
2.5.4 sed命令讲解
- sed -n 取消默认输出
- sed -e 可以同时指定多个命令执行
- sed -f 将多个命令写进文件里面在执行
- sed -i 修改源文件
- sed -n a数据 向下n行添加内容
- sed -n i数据 向上n行添加内容
- sed -n $数据 最后一行添加数据
- sed -d 删除指定行的数据
- sed -I 's#a#b#g' 替换a数据为b
2.5.5 sed详细讲解
2.5.5.1 查找匹配的行(-n -e)
- 根据行来匹配
行内容(-n)
[root@oldboy6666 ~] # sed '2p' 1.txt 没加(-n不会取消默认输出,会全部输出出来)
101,oldboy,CEO
102,zhaoyao,CTO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@oldboy6666 ~] # sed -n '2p' 1.txt -n:取消默认输出
102,zhaoyao,CTO
[root@oldboy6666 ~] #
行到第5行的内容
[root@oldboy6666 ~] # sed -n '2,5p' 1.txt
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@oldboy6666 ~] #
行,第3行,第5行的内容,其他行都不要(-e)
[root@oldboy6666 ~] # sed -n '1p;3p;5p' 1.txt 第一种办法
101,oldboy,CEO
103,Alex,COO
105,feixue,CIO
[root@oldboy6666 ~] # sed -ne '1p' -e '3p' -e '5p' 1.txt 使用-e参数来做
101,oldboy,CEO
103,Alex,COO
105,feixue,CIO
[root@oldboy6666 ~] #
- 根据内容来匹配
2.5.5.1.4 查找有oldboy的行
[root@oldboy6666 ~] # sed -n '/oldboy/p' 1.txt
101,oldboy,CEO
[root@oldboy6666 ~] #
2.5.5.1.5 查找CTO到CIO的行
[root@oldboy6666 ~] # sed -n '/CTO/,/CIO/p' 1.txt
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@oldboy6666 ~] #
2.5.5.1.6 查找有CTO和COO的行,其他行的内容都不要
[root@oldboy6666 ~] # sed -n '/CTO/p;/COO/p' 1.txt 第一种分号方法解决
102,zhaoyao,CTO
103,Alex,COO
[root@oldboy6666 ~] #
[root@oldboy6666 ~] # sed -ne '/CTO/p' -e '/COO/p' 1.txt 第二种使用-e解决
102,zhaoyao,CTO
103,Alex,COO
[root@oldboy6666 ~] # sed -nr '/CTO|COO'/p 1.txt 第三种使用扩展正则来解决
102,zhaoyao,CTO
103,Alex,COO
[root@oldboy6666 ~] #
2.5.5.2 增加内容(-a –i -c)
根据行号进行查找
行的前面添加一行信息,为100,liangyuxing,stu
[root@oldboy6666 ~] # sed '2i100,liangyuxing,stu' 1.txt
101,oldboy,CEO
100,liangyuxing,stu
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@oldboy6666 ~] #
行下面添加一行信息,为100,liangyuxing,stu
[root@oldboy6666 ~] # sed '4a100,liangyuxing,stu' 1.txt
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
100,liangyuxing,stu
105,feixue,CIO
[root@oldboy6666 ~] #
行将内容清空,更换成100,liangyuxing,stu
[root@oldboy6666 ~] # sed '3c100,liangyuxing,stu' 1.txt
101,oldboy,CEO
102,zhaoyao,CTO
100,liangyuxing,stu
104,yy,CFO
105,feixue,CIO
[root@oldboy6666 ~] #
根据文件的内容查找
2.5.5.2.4 在文件oldboy字符上面一行添加liangyuxing,stu
[root@oldboy6666 ~] # sed '/oldboy/i100,liangyuxing,stu' 1.txt
100,liangyuxing,stu
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@oldboy6666 ~] #
2.5.5.2.5 在文件CTO字符下面一行添加liangyuxing,stu
[root@oldboy6666 ~] # sed '/CTO/a100,liangyuxing,stu' 1.txt
101,oldboy,CEO
102,zhaoyao,CTO
100,liangyuxing,stu
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@oldboy6666 ~] #
2.5.5.2.6 将内容有COO的这行内容清空,更换成100,liangyuxing,stu
[root@oldboy6666 ~] # sed '/COO/c100,liangyuxing,stu' 1.txt
101,oldboy,CEO
102,zhaoyao,CTO
100,liangyuxing,stu
104,yy,CFO
105,feixue,CIO
[root@oldboy6666 ~] #
2.5.5.2.7 添加多行内容(\n 换行)
[root@oldboy6666 ~] # sed '/COO/a100,liangyuxing,stu\n1111' 1.txt
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
100,liangyuxing,stu
1111
104,yy,CFO
105,feixue,CIO
[root@oldboy6666 ~] #
2.5.5.2.8 在文本的最后一行添加内容($a)
[root@oldboyedu oldboy] # sed '$a 107,oldboy,CTO' person.txt
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
107,oldboy,CTO
[root@oldboyedu oldboy] #
2.5.5.3 删除内容(-d)
根据行号进行查找
行内容
[root@oldboy6666 ~] # sed '3d' 1.txt
101,oldboy,CEO
102,zhaoyao,CTO
104,yy,CFO
105,feixue,CIO
[root@oldboy6666 ~] #
行内容
[root@oldboy6666 ~] # sed '1,3d' 1.txt
104,yy,CFO
105,feixue,CIO
[root@oldboy6666 ~] #
行到最后一行的内容
[root@oldboy6666 ~] # sed '3,$d' 1.txt
101,oldboy,CEO
102,zhaoyao,CTO
根据内容进行查找
2.5.5.3.4 删除oldboy到COO的行
[root@oldboy6666 ~] # sed '/oldboy/,/COO/d' 1.txt
104,yy,CFO
105,feixue,CIO
[root@oldboy6666 ~] #
2.5.5.3.5 删除oldboy这行内容
[root@oldboy6666 ~] # sed '/oldboy/d' 1.txt
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@oldboy6666 ~] #
2.5.5.3.6 删除COO到最后一行的内容
[root@oldboy6666 ~] # sed '/COO/,$d' 1.txt
101,oldboy,CEO
102,zhaoyao,CTO
[root@oldboy6666 ~] #
2.5.5.4 修改内容(-i s###g)
行内容,将COO改成CGO
[root@oldboy6666 ~] # sed -n '/COO/s#COO#CGO#gp' 1.txt
103,Alex,CGO
[root@oldboy6666 ~] #
2.5.5.4.2 用sed将IP过滤出来(后项引用前项)
[root@oldboy6666 ~] # ip a s eth0 |sed -rn '3s#^.*inet(.*)/24.*#\1#gp' centos7
10.0.0.200
[root@oldboy6666 ~] #
[root@oldboy6666 oldboy] # ifconfig eth0 | sed -nr '2s#^.*inet(.*) net.*$#\1#gp' | cat -A centos6
10.0.0.200$
[root@oldboy6666 oldboy] #
2.5.5.4.3 用sed将属性的权限过滤出来
[root@oldboy6666 ~] # stat /etc/hosts |sed -nr '4s#^A.*\((.*)/-.*#\1#gp'
0644
[root@oldboy6666 ~] #
2.5.4.4.4 用sed将/oldboy下面的*.txt换成*.log
[root@oldboy6666 ~] # ls | xargs -n 1 | sed -r 's#(.*)\.txt#mv \1.txt \1.log#g' | sh
[root@oldboy6666 ~] # ls
01.log 02.log 03.log 04.log 05.log 06.log 07.log 08.log 09.log 10.log
[root@oldboy6666 ~] #
2.5.5.4.4 在当前目录下面将CTO改换成LYX(-ri)
[root@oldboy6666 oldboy] # cat 1.txt 2.txt
102,zhaoyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,lyx,STU
CTO
[root@oldboy6666 oldboy] #
grep "匹配的条件" -rl 当前目录
查找当前目录匹配的条件做替换
[root@oldboy6666 oldboy] # sed 's#CTO#LYX#g' `grep "CTO" -rl ./`
102,zhaoyao,LYX
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,lyx,STU
LYX
2.5.6 sed常见的错误
2.5.6.1 sed -n和-i不能同时使用
[root@oldboy6666 ~] # sed '/COO/s#COO#CGO#gp' 1.txt
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,CGO
103,Alex,CGO
104,yy,CFO
105,feixue,CIO
[root@oldboy6666 ~] # sed -n '/COO/s#COO#CGO#gp' 1.txt
103,Alex,CGO
[root@oldboy6666 ~] # sed -ni '/COO/s#COO#CGO#gp' 1.txt
[root@oldboy6666 ~] # cat 1.txt
103,Alex,CGO
2.5.6.2 使用sed命令的时候i一定要放在最后面,要不会生成备份文件
[root@oldboy6666 ~] # sed -r '/COO/s#COO#CFO#g' 1.txt
101,oldboy,CEO
102,zhaoyao,CTO
103,Alex,CFO
104,yy,CFO
105,feixue,CIO
[root@oldboy6666 ~] # sed -ir '/COO/s#COO#CFO#g' 1.txt
[root@oldboy6666 ~] # ls
1.txt 1.txtr i如果不放在最后面,会默认在胜场一个备份文件,以i后面带有的参数为备份文件的名称
[root@oldboy6666 ~] #
2.6 awk
2.6.1 awk的地位和作用
地位:awk是三剑客的第一位,可以进行模式扫描和语言编程
作用:可以进行查询数据,排除数据,替换数据
统计数据
通常是对日志文件进行操作的,同样也可以对文本信息和配置信息进行处理
2.6.2 awk语法格式
awk [参数] '模式{动作}' 文件信息 模式可以理解成条件
2.6.3 awk的讲解
2.6.3.1 awk基本操作
2.6.3.1.1 显示xiaoyu的姓氏和ID号码
[root@oldboy6666 oldboy] # awk '/Xiaoyu/{print $2,$3}' 3.txt
Xiaoyu 390320151
[root@oldboy6666 oldboy] #
2.6.3.1.2 姓氏是Zhang的人,显示他的第二次捐款金额及他的名字
[root@oldboy6666 oldboy] # awk -F '[: ]+' '/Zhang/{print "名字为"$2"\t捐款金额"$5}' 3.txt
名字为Dandan 捐款金额100
名字为Xiaoyu 捐款金额90
[root@oldboy6666 oldboy] #
开头的ID号码的人的全名和ID号码
[root@oldboy6666 oldboy] # awk '$3~/^41/{print "名字为"$1$2"\t""ID号码为"$3}' 3.txt
名字为ZhangDandan ID号码为41117397
名字为LiuBingbing ID号码为41117483
[root@oldboy6666 oldboy] #
或5的人的全名
[root@oldboy6666 oldboy] # awk '$3~/1$|5$/{print "名字为"$1$2}' 3.txt 第一种办法
名字为ZhangXiaoyu
名字为WuWaiwai
名字为WangXiaoai
名字为LiYoujiu
名字为LaoNanhai
[root@oldboy6666 oldboy] # awk '$3~/[15]$/{print "名字为"$1$2}' 3.txt 第二种办法
名字为ZhangXiaoyu
名字为WuWaiwai
名字为WangXiaoai
名字为LiYoujiu
名字为LaoNanhai
2.6.3.1.5 获取文件中有井号或空行的内容, 将空行和井号信息的行排除
[root@oldboy6666 oldboy] # awk '$3!~/#|^$/{print $0}' 3.txt
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50 :95 :135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
[root@oldboy6666 oldboy] #
2.6.3.1.6 (替换)显示Xiaoyu的捐款,每个捐款数额都是以$开头, 如$110$220$330
gsub(/需要替换的内容/,"替换成什么",哪列进行替换)
[root@oldboy6666 oldboy] # awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' 3.txt
$155$90$201
[root@oldboy6666 oldboy] #
2.6.3.2 awk命令模式(比较模式)
的所有信息
[root@oldboy6666 oldboy] # awk 'NR>2{print $0}' 1.txt
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
[root@oldboy6666 oldboy] #
小于5的所有信息
[root@oldboy6666 oldboy] # awk 'NR>2 && NR<5{print $0}' 1.txt
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
[root@oldboy6666 oldboy] #
2.6.3.3 特殊模式(BEGIN,END)
2.6.3.3.1 概念介绍
BEGIN:处理文件之前,先做什么事情
END:处理文件之后,在做什么事情
2.6.3.3.2 在文件的第一行添加表头
[root@oldboy6666 oldboy] # awk 'BEGIN{print "姓","名字","ID号码","捐款总额"}{print $0}' 1.txt | column -t
姓
名字 ID号码
捐款总额
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
[root@oldboy6666 oldboy] #
2.6.3.3.3 在文件的末行添加"HELLO WORD"
[root@oldboy6666 oldboy] # awk 'BEGIN{print "姓","名字","ID号码","捐款总额"}{print $0};END {print"HELLOWORD"}' 1.txt | column -t
姓
名字 ID号码
捐款总额
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
HELLOWORD
[root@oldboy6666 oldboy] #
2.6.3.4 awk计算
2.6.3.4.1 awk乘法运算
[root@oldboy6666 oldboy] # awk '{print 3*2}'
^C
[root@oldboy6666 oldboy] # awk 'BEGIN{print 3*2}'
6
[root@oldboy6666 oldboy] # awk 'BEGIN{print 3*2*6}'
36
[root@oldboy6666 oldboy] # awk 'BEGIN{print 3*2*6*8}'
288
[root@oldboy6666 oldboy] #
2.6.3.4.2 awk数量求和
[root@oldboy6666 oldboy] # cat 2.txt
1
2
3
4
[root@oldboy6666 oldboy] #
[root@oldboy6666 oldboy] # awk 'BEGIN{i++}END{print $i}' 2.txt
4
[root@oldboy6666 oldboy] # seq 10|awk '{sum=sum+$1}END{print sum}'
55
[root@oldboy6666 oldboy] #
2.6.3.4.3 awk数量求差
[root@oldboy6666 oldboy] # awk 'BEGIN{sum=10000}NR!=1{sum=sum-$1}END{print sum}' 2.txt
4000
[root@oldboy6666 oldboy] #
2.6.3.5 awk数组
位
[root@oldboy6666 ~] # cat /oldboy/shuzu/3.txt | column -t
01 192.168.1.21 "FALSE"
02 192.168.1.21 "FALSE"
03 192.168.1.31 "FALSE"
04 192.168.1.31 "FALSE"
05 192.168.1.21 "TRUE"
06 192.168.1.21 "TRUE"
07 192.168.1.21 "TRUE"
08 192.168.1.21 "FALSE"
09 192.168.1.21 "FALSE"
10 192.168.1.41 "TRUE"
11 192.168.1.41 "TRUE"
12 192.168.1.41 "FALSE"
13 192.168.1.41 "FALSE"
14 192.168.1.21 "TRUE"
15 192.168.1.31 "FALSE"
16 192.168.1.31 "TRUE"
17 192.168.1.31 "TRUE"
18 192.168.1.31 "TRUE"
19 192.168.1.51 "TRUE"
20 192.168.1.51 "TRUE"
21 192.168.1.51 "FALSE"
22 192.168.1.51 "TRUE"
23 192.168.1.51 "TRUE"
24 192.168.1.31 "TRUE"
25 192.168.1.31 "TRUE"
[root@oldboy6666 ~] #
[root@oldboy6666 ~] # awk '$3~/FALSE/{count[$2]++} END {for ( i in count ) print(count[i])"------>"i}' /oldboy/shuzu/3.txt | head -3
4------>192.168.1.21
3------>192.168.1.31
2------>192.168.1.41
2.6.3.5.2 awk计算a和b的和
[root@oldboy6666 shuzu] # cat 1.txt | awk '{sum[$2]+=$1}END{for(i in sum) print i,sum[i]}'
a 4
b 6
[root@oldboy6666 shuzu] # cat 1.txt
1 a
2 b
3 a
4 b
[root@oldboy6666 shuzu] #
2.6.3.5.3 awk得出奇数
[root@oldboy6666 shuzu] # cat 2.txt
1
2
3
4
5
6
7
8
9
10
[root@oldboy6666 shuzu] #
[root@oldboy6666 shuzu] # awk '{sum[NR]=$0}END{for(i=1;i<=NR;i+=2) print sum[i]}' 2.txt
1
3
5
7
9
[root@oldboy6666 shuzu] #
'2.6.3.5.4 awk查看相同IP出现的次数和流量进行统计
[root@oldboyedu awk_shuzu] # cat 6.txt
01 192.168.1.21 3000
02 192.168.1.21 3000
03 192.168.1.31 3000
04 192.168.1.31
05 192.168.1.21
06 192.168.1.21 3000
07 192.168.1.21
08 192.168.1.21
09 192.168.1.21
10 192.168.1.41
11 192.168.1.41 3000
12 192.168.1.41
13 192.168.1.41
14 192.168.1.21 30000
15 192.168.1.31
16 192.168.1.31
17 192.168.1.31
18 192.168.1.31
19 192.168.1.51
20 192.168.1.51 50000
21 192.168.1.51
22 192.168.1.51
23 192.168.1.51 500000
24 192.168.1.31
25 192.168.1.31
[root@oldboyedu awk_shuzu] #
[root@oldboyedu awk_shuzu] # awk '{count[$2]++;sum[$2]+=$3}END{for(i in sum) print "IP地址:" i,"IP地址统计次数:"count[i],"流量统计:"sum[i]}' 6.txt
IP地址:192.168.1.21 IP地址统计次数:8 流量统计:39000
IP地址:192.168.1.31 IP地址统计次数:8 流量统计:3000
IP地址:192.168.1.41 IP地址统计次数:4 流量统计:3000
IP地址:192.168.1.51 IP地址统计次数:5 流量统计:550000
[root@oldboyedu awk_shuzu] #
'
2.6.4 常用的awk内置变量
- $0 当前记录(作为单个变量)
- $1~$n 当前记录的第n个字段,字段间由FS分隔
- FS 输入字段分隔符 默认是空格
- NF 当前记录中的字段个数,就是有多少列
- NR 已经读出的记录数,就是行号,从1开始
- RS 输入的记录他隔符默 认为换行符
- OFS 输出字段分隔符 默认也是空格
- ORS 输出的记录分隔符,默认为换行符
- ARGC 命令行参数个数
- ARGV 命令行参数数组
- FILENAME 当前输入文件的名字
- IGNORECASE 如果为真,则进行忽略大小写的匹配
- ARGIND 当前被处理文件的ARGV标志符
- CONVFMT 数字转换格式 %.6g
- ENVIRON UNIX环境变量
- ERRNO UNIX系统错误消息
- FIELDWIDTHS 输入字段宽度的空白分隔字符串
- FNR 当前记录数
- OFMT 数字的输出格式 %.6g
- RSTART 被匹配函数匹配的字符串首
- RLENGTH 被匹配函数匹配的字符串长度
- SUBSEP \034
2.6.4.1 $0当前文本的内容
[root@oldboyedu oldboy] # awk '{print $0}' awk.txt
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
[root@oldboyedu oldboy] #
2.6.4.2 $1~$n表示的是代表的是第几个分段,由FS进行分割
[root@oldboyedu oldboy] # awk '{print $1,$NF}' awk.txt
Zhang :250:100:175
Zhang :155:90:201
Meng :250:60:50
Wu :250:80:75
Liu :250:100:175
Wang :50:95:135
Zi :250:168:200
Li :175:75:300
Lao :250:100:175
[root@oldboyedu oldboy] #
2.6.4.3 FS表示的是输入字段分隔符,默认是空格
[root@oldboyedu oldboy] # awk 'BEGIN{FS=":"}{print $1,$2}' awk.txt
Zhang Dandan 41117397 250
Zhang Xiaoyu 390320151 155
Meng Feixue 80042789 250
Wu Waiwai 70271111 250
Liu Bingbing 41117483 250
Wang Xiaoai 3515064655 50
Zi Gege 1986787350 250
Li Youjiu 918391635 175
Lao Nanhai 918391635 250
[root@oldboyedu oldboy] #
2.6.4.4 NF表示取第几列,默认是空格为分隔符($NF代表最后一列)
[root@oldboyedu oldboy] # awk 'BEGIN{NF=3}{print $2 }' awk.txt | column -t
Dandan
Xiaoyu
Feixue
Waiwai
Bingbing
Xiaoai
Gege
Youjiu
Nanhai
[root@oldboyedu oldboy] #
2.6.4.5 NR默认表示取第几行,默认换行符为分隔符
[root@oldboyedu oldboy] # awk 'NR==4{print $2 }' awk.txt
Waiwai
[root@oldboyedu oldboy] # awk 'NR==2{print $2 }' awk.txt
Xiaoyu
[root@oldboyedu oldboy] # awk 'NR==2{print }' awk.txt
Zhang Xiaoyu 390320151 :155:90:201 1
[root@oldboyedu oldboy] #
2.6.4.6 RS:表示的是行分隔符,默认换行符,也可以自己自定义
[root@oldboyedu oldboy] # cat awk.txt
Zhang Dandan 41117397 :250:100:175 # 1
Zhang Xiaoyu 390320151 :155:90:201 # 1
Meng Feixue 80042789 :250:60:50 # 1
Wu Waiwai 70271111 :250:80:75 # 1
Liu Bingbing 41117483 :250:100:175 # 1
Wang Xiaoai 3515064655 :50:95:135 # 1
Zi Gege 1986787350 :250:168:200 # 1
Li Youjiu 918391635 :175:75:300 # 1
Lao Nanhai 918391635 :250:100:175 # 1
[root@oldboyedu oldboy] #
[root@oldboyedu oldboy] # awk 'BEGIN{RS="#"}{print}' awk.txt 以#号为分隔符进行换行输出
Zhang Dandan 41117397 :250:100:175
1
Zhang Xiaoyu 390320151 :155:90:201
1
Meng Feixue 80042789 :250:60:50
1
Wu Waiwai 70271111 :250:80:75
1
Liu Bingbing 41117483 :250:100:175
1
Wang Xiaoai 3515064655 :50:95:135
1
Zi Gege 1986787350 :250:168:200
1
Li Youjiu 918391635 :175:75:300
1
Lao Nanhai 918391635 :250:100:175
1
[root@oldboyedu oldboy] #
2.6.4.7 OFS:表示的是取n列中间用什么分割,默认是空格
[root@oldboyedu oldboy] # awk 'BEGIN{OFS="##"}{print $2,$3}' awk.txt 取出2列并且用##进行分割
Dandan##41117397
Xiaoyu##390320151
Feixue##80042789
Waiwai##70271111
Bingbing##41117483
Xiaoai##3515064655
Gege##1986787350
Youjiu##918391635
Nanhai##918391635
[root@oldboyedu oldboy] #
2.6.4.8 ORS:表示的是取n行中间用什么分割,默认换行符
[root@oldboyedu oldboy] # awk 'BEGIN{ORS="##"}{print $2}' awk.txt
Dandan##Xiaoyu##Feixue##Waiwai##Bingbing##Xiaoai##Gege##Youjiu##Nanhai##
2.6.4.9 ARGC命令行参数个数;命令行参数属组
[root@oldboyedu oldboy] # awk 'BEGIN{FS=":";print "ARGC="ARGC;for(k in ARGV) {print k"="ARGV[k]; }}' awk.txt
ARGC=2
0=awk
1=awk.txt
[root@oldboyedu oldboy] #
2.6.4.10 FILENAME当前输入文件的名字
[root@oldboyedu oldboy] # awk '{print FILENAME}' awk.txt
awk.txt
awk.txt
awk.txt
awk.txt
awk.txt
awk.txt
awk.txt
awk.txt
awk.txt
[root@oldboyedu oldboy] #
2.6.4.11 ENVIRON Lunix环境变量
[root@oldboyedu oldboy] # awk 'BEGIN{print ENVIRON["PATH"]}' awk.txt
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@oldboyedu oldboy] #
2.6.4.12 OFMT数字格式的输出
[root@oldboyedu oldboy] # awk 'BEGIN{OFMT="%.3f";print 2/3,123.11111111;}' awk.txt
0.667 123.111
[root@oldboyedu oldboy] #
2.6.4.13 FIELDWIDTHS按宽度指定分隔符
[root@oldboyedu oldboy] # echo 20191001142533| awk 'BEGIN{FIELDWIDTHS="4 2 2 2 2 2"}{print $1"-"$2"-"$3,$4":"$5":"$6}'
2019-10-01 14:25:33
[root@oldboyedu oldboy] #
2.6.4.14 RLENGTH被匹配函数匹配的字符串长度
[root@oldboyedu oldboy] # awk 'BEGIN{start=match("this is a test",/[a-z]+$/); print start, RSTART, RLENGTH }'
11 11 4
[root@oldboyedu oldboy] # awk 'BEGIN{start=match("this is a test",/^[a-z]+$/); print start, RSTART, RLENGTH }'
0 0 -1
[root@oldboyedu oldboy] #
FS演示
[root@model 20190502]# awk 'BEGIN {FS="\t+"}{print $3}' aa.txt
333
NF演示,(NF==num,代表这个num匹配的是最后一列)
[root@model 20190502]# cat bb.txt
11 223 3
3 21 22 3
5 6 3 2
[root@model 20190502]# awk 'NF==3{print $NF}' bb.txt
3
[root@model 20190502]#
NR演示(NR==num,代表这个num是第几行)
[root@model 20190502]# ifconfig eth0 | awk -F [" ":]+ 'NR==2{print $4}'
192.168.43.210
[root@model 20190502]#
OFS:改变分割符输出以后的分割标志,默认为空格
[root@model 20190502]# ifconfig eth0 | awk -F [" ":]+ 'BEGIN {OFS="#"}NR==2{print $4,$2}'
192.168.43.210#inet
[root@model 20190502]#
[root@model 20190502]# awk 'BEGIN{FS=" ";OFS="#"}{print "#"$0}' bb.txt
#11 223 3
#3 21 22 3
#5 6 3 2
[root@model 20190502]# awk 'BEGIN{FS=" ";OFS="#"}{print "#"$0}' bb.txt > 1.txt
[root@model 20190502]# cat 1.txt
#11 223 3
#3 21 22 3
#5 6 3 2
[root@model 20190502]#
ORS:默认为换行输出,可以自定义输出标志
[root@model 20190502]# awk 'BEGIN{FS=" ";ORS="#"}{print "#"$0}' bb.txt
#11 223 3##3 21 22 3##5 6 3 2###
先找到匹配的行,在配置分隔符,发现最后失败,有错
第一种;错误的方案
[root@model 20190502]# awk -F ":" '($1=="root")&&($5=="root"){OFS="*************"}{print $1,$5}' passwd
root*************root
bin*************bin
daemon*************daemon
adm*************adm
lp*************lp
sync*************sync
第二种;正确的答案
[root@model 20190502]# awk -F ":" 'BEGIN{OFS="**"}($1=="root")&&($5=="root"){print $1,$5}' passwd
root**root
[root@model 20190502]#
找到匹配root的行,分割符为:,并且root为$1
[root@model 20190502]# awk -F ":" '$1~/root/{print $0}' passwd
root:x:0:0:root:/root:/bin/bash
[root@model 20190502]#
2.6.5 awk之BEGIN和END模块用法的讲解
(1):BEGIN讲解
if判断语句讲解
[root@model 20190502]# awk 'BEGIN{a=10;b=20;if(a>2&&b>1);print "ok"}'
ok
正则运算
[root@model 20190502]# awk -F ":" 'BEGIN{a="/bin/bash/";if($NF~/^b.*sh/);print "NF"}'
NF
[root@model 20190502]#
循环语句判断
[root@model 20190502]# awk 'BEGIN{while(a<6){a=a+1;print a}}'
1
2
3
4
5
6
[root@model 20190502]# awk 'BEGIN{for(a=0;a<7;a++) if(a%2==0)print a}'
0
2
4
6
[root@model 20190502]#
[root@model 20190502]# awk 'BEGIN{for(a=0;a<7;a++) sum+=a;print sum}'
21
[root@model 20190502]#
三目运算符
[root@model 20190502]# awk 'BEGIN{a="b";print a=="b"?"over":"err"}'
over
[root@model 20190502]# awk 'BEGIN{a="b";print a=="c"?"over":"err"}'
err
[root@model 20190502]#
(2):END讲解
[root@model 20190502]# awk '{$2>10;a++} END {print $1}' aa.txt
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
最全的三剑客和linux正则符号讲解的更多相关文章
- Linux特殊符号浅谈
Linux特殊字符浅谈 我们经常跟键盘上面那些特殊符号比如(?.!.~...)打交道,其实在Linux有其独特的含义,大致可以分为三类:Linux特殊符号.通配符.正则表达式. Linux特殊符号又可 ...
- Linux特殊符号及基础正则表达式
第1章 特殊符号 1.1 引号系列 1.1.1 单引号 所见即所得 单引号里面的内容会原封不动的输出 [root@oldboyedu50-lnb ~]# echo 'oldboy $LANG $PS ...
- 系统通配符号、系统正则符号,grep
系统通配符号.系统正则符号,grep 1 系统通配符号 系统通配符号:借助通配符号 匹配文件名称信息 1.1 *: 匹配所有(任意)字符信息 找寻以old开头的文件 find /oldboy -typ ...
- Linux Shell脚本编程--Linux特殊符号大全
Linux Shell脚本编程--Linux特殊符号大全 linux_shell 特殊符号的介绍 2011
- java替换文本中所有的正则符号 Java问题通用解决代码
开发时遇到一个需求,需要对一段文本中的所有正则符号进行转义,不然使用split分割方法分割文本的话无效,想到用替换来做,全部替换正则符号为转义后的符号 贴java实现代码: 1.测试版 ...
- linux shell `符号详解
linux shell `符号详解 <pre>[root@iZ23uewresmZ arjianghu]# echo `ls`asss.html common guaji.php imag ...
- 从自旋锁、睡眠锁、读写锁到 Linux RCU 机制讲解
同步自我的 csdn 博客 6.S081 从自旋锁.睡眠锁.读写锁到 Linux RCU 机制讲解_我说我谁呢 --CSDN博客 总结一下 O/S 课程里面和锁相关的内容. 本文是 6.S0 ...
- Linux特殊符号
第1章 回顾昨天 1.1 linux如何让一个服务/脚本开机自启动? chkconfig /etc/rc.local 1.2 被chkconfig管理 需要什么条件 1.2.1 必须放在/etc/in ...
- Linux正则与文本处理工具(10)
正则表达式 (Regular Expression, RE, 或称为常规表达式)是通过一些特殊字符的排列,用于『查找/替换/删除』一行或多行文字或字符串,简单的说,正则表达式就是用在字串的处理上面的一 ...
随机推荐
- java架构之路(MQ专题)kafka集群配置和简单使用
前面我们说了RabbitMQ和RocketMQ的安装和简单的使用,这次我们说一下Kafka的安装配置,后面我会用几个真实案例来说一下MQ的真实使用场景.天冷了,不愿意伸手,最近没怎么写博客了,还请见谅 ...
- python高阶函数的使用
目录 python高阶函数的使用 1.map 2.reduce 3.filter 4.sorted 5.小结 python高阶函数的使用 1.map Python内建了map()函数,map()函数接 ...
- PL真有意思(三):名字、作用域和约束
前言 这两篇写了词法分析和语法分析,比较偏向实践.这一篇来看一下语言设计里一个比较重要的部分:名字.在大部分语言里,名字就是标识符,如果从抽象层面来看名字就是对更低一级的内存之类的概念的一层抽象.但是 ...
- python基础-面向对象编程之封装、访问限制机制和property
面向对象编程之封装 封装 定义:将属性和方法一股脑的封装到对象中,使对象可通过"对象."的方式获取或存储数据. 作用:让对象有了"."的机制,存取数据更加方便 ...
- pandas dataframe重复数据查看.判断.去重
本文详解如何使用pandas查看dataframe的重复数据,判断是否重复,以及如何去重 dataframe数据样本: import pandas as pd df = pd.DataFrame({' ...
- 2019-10-28:渗透测试学习,sqlmap的使用,笔记
sqlmap工具的使用sql注入工具,明小子,啊D,萝卜头,穿山甲,sqlmap等开源自动化注入利用工具,支持的数据库有12种,在/plugins中可以看到支持的数据库种类,在所有注入利用工具中是最好 ...
- 视频转GIF+GIF录制
GIF录制 Windows--oCam oCam使用非常简便,它还可以用来录音,录制视频,并且是单文件版,很小,使用也非常方便,如果用来录制GIF,大家导出录制的视频选择GIF格式就可以了: Wind ...
- NTP服务搭建详解一条龙
说在前面:ntp和ntpdate区别 ①两个服务都是centos自带的(centos7中不自带ntp).ntp的安装包名是ntp,ntpdate的安装包是ntpdate.他们并非由一个安装包提供. ② ...
- jquery操作css样式的方法
jquery操作css样式的方法(设置和获取)
- MySQL数据库day20190922
1.dos命令 set names gbk; 2.MySQL练习#创建school数据库: create database school;#切换school数据库: use school; # pri ...