注意:这篇文章上次更新于944天前,文章内容可能已经过时。
grep
在 etc/passwd 中查找
-
找出 root 有关的行
grep "root" /etc/passwd
-
找出 root 用户的行
grep "^root" /etc/passwd
-
匹配以 root 开头或者以 ub 开头的行
grep -E "^(root|ub)" /etc/passwd
-E 选项:使用扩展正则表达式
-
匹配 root 用户和ubuntu用户的行
grep -E "^(root|ubuntu)\>" /etc/passwd
3 中会匹配 root1 root2 等开头的行,但是 4 不会。
-
过滤出 bin 开头的行并显示行号
grep -n "^bin" /etc/passwd
-n : 显示行号
-
过滤出除了 root 开头的行
grep -v "^root" /etc/passwd
-v : 反转匹配
-
统计 root 用户出现的次数
grep -c '^root' /etc/passwd
-c : 统计次数
-
匹配 ubuntu 用户,最多两次
grep -m 2 '^root' /etc/passwd
-m : 最多次数
-
匹配多文件列出存在信息的文件名字
grep -l '^root' /etc/passwd pwd.txt null.txt
-l : 显示匹配成功的文件名字
-
显示不以 /bin/bash 结尾的行
grep -v "/bin/bash$" -n /etc/passwd
-
找出文件中的两位数或三位数
grep -E "[0-9]{2,3}" /etc/passwd
上述写法不能获得正确的匹配结果,它会在超过 3 位数的数字中匹配其中的两位和三位。这是不符合题意的。如图所示。
正确的写法应该进行左右封闭。
grep -E "\<[0-9]{2,3}\>" /etc/passwd
在以下文本文件中查找。
I like my lover.
I love my lover.
He likes his lovers.
He loves his lovers.
#she loves her cat
i want ride my bike
-
找出以至少一个空格字符开头,后面是非空字符的行。
grep -E "^[[:space:]]+[^[:space:]]" test.txt
第一个 ^ 表示行开头 第二个 [ ] 中的 ^ 表示取反
-
找出以 i 开头的行 忽略大小写
grep -i "^i" test.txt grep -E "^[iI]" test.txt grep -E "^(i|I)" test.txt
-i : 忽略大小写
-
找出系统中root、 ubuntu 的用户信息
grep -E "^(root|ubuntu)\>" /etc/passwd
-
找出 /etc/init.d/functions 文件中的所有的函数名
grep -E "^.+\(\)" /etc/init.d/functions grep -E "[a-zA-z]+\(\)" /etc/init.d/functions grep -E "[[:alnum:]]+\(\)" /etc/init.d/functions
-
找出用户名和 shell 相同的用户
grep -E "^([^:]+\>).*\1$" /etc/passwd
思路:匹配非冒号的字符一次或多次,遇到冒号就右封闭,任意匹配中间结果,最后匹配 \1 ,\1 为前面小括号内的匹配结果,最后以 $ 结尾。
sed
首先在当前目录创建 pwd.txt
-
替换文件的 root 为 change ,只替换一次和替换所有
# 替换一次 sed 's/root/change/' pwd.txt # 模式中加个 p 表示打印替换的行 -n 取消默认输出 (-n 一般和 p 配合) sed 's/root/change/p' pwd.txt -n # 全局替换 sed 's/root/change/gp' pwd.txt -n
-
替换文件所有的 root 为 change,且仅仅打印替换的结果
sed 's/root/change/gp' pwd.txt -n
-
替换前 10 行 b 开头的用户,改为 C,且仅仅打印替换的结果
# 1,10 表示 1 到 10 行 sed -n '1,10s/^b/C/p' pwd.txt
-
替换前 10 行 b 开头的用户,改为 C,且将 m 开头的行改为 M,且仅仅显示替换的结果
# -e 编辑多次 sed -n -e '1,10s/^b/C/p' -e 's/^m/M/p' pwd.txt
-
删除 4 行后面的所有
# d 删除 $ 结尾 sed '5,$d' pwd.txt
-
删除 root 开始 到 ftp 之间的行
# 双斜线中进行正则匹配 sed '/^root/,/^ftp/d' pwd.txt
-
将文件中空白字符开头的行,添加注释符#
sed -e 's/^[[:space:]]/#/g' -e 's/^$/#/g' test.txt
-
删除文件的空白和注释行
sed -e '/^#/d' -e '/^$/d' test.txt sed '/^#/d;/^$/d' test.txt
-
给文件的前三行添加@
# -r 使用扩展正则 sed -r '1,3s/(^.)/@\1/' test.txt
-
sed 取出 IP 地址
# 根据 ifconfig 的输出,先打印第二行,在将ip前面字符替换为空,再将ip 后面的字符替换为空 ifconfig | sed '2p' -n | sed 's/^.*inet//' | sed 's/netmask.*//' ifconfig | sed '2s/^.*inet//;s/netmask.*//p' -n ifconfig | sed -e '2s/^.*inet//' -e 's/netmask.*//p' -n
-
找出系统的版本
sed -r 's/^.*"(.*)"/\1/p' /etc/lsb-release -n
-i 代表写入文件,不加-i都是修改内存中的数据
awk
-
在当前系统中打印出所有普通用的的用户名和家目录
# -F 指定分隔符 NF 字段数量 $1 表示第一列 $0 表示一整行 awk -F ":" '$3 >= 1000{print $1,$(NF-1)}' /etc/passwd
-
给 test.txt 前五行添加#
# NR 行号 单引号中的双引号表示字符串 awk 'NR<6{print "#"$0}' test.txt
-
取出所有电话号码
# 文件内容: 姓名 地区 区号 电话号 捐款信息 Mike Dalian:[1235] 365-5426:123:456:789 Tom Dalian:[1235] 362-5426:123:456:789 Jerry Dalian:[1236] 154-5426:123:456:789 Moko Dalian:[1235] 999-5426:123:456:789 # -F 指定空格和:为分隔符 # ! 为取反 即非空行执行打印 awk -F "[ :]" '!/^$/{print $4}' aaa.txt
-
显示出 Tom 的电话
awk -F "[ :]" '/^Tom/{print $1,$4}' aaa.txt
-
找去地区为 D 开头的
# ~ 为指定字段正则匹配 awk -F "[ :]" '$2~/^D/{print $2}' aaa.txt
-
显示区号是 1235 的人名
awk -F "[ :]" '$3~/\[1235\]/{print $1}' aaa.txt
-
显示Mike 的捐款信息,并在每一条前加上$
awk -F "[ :]" '/^Mike/{print "$"$(NF-2),"$"$(NF-1),"$"$(NF)}' aaa.txt
-
显示所有人的
地区+,+名字
awk -F "[ :]" '!/^$/{print $2","$1}' aaa.txt # 通过 -v 修改输出间隔符 awk -F "[ :]" -v OFS="," '!/^$/{print $2,$1}' aaa.txt
-
删除文件的空白行
awk '!/^$/' aaa.txt # awk 默认动作为 {print $0} awk '!/^$/{print $0}' aaa.txt