GREP
常见参数
' 匹配关键词
grep "root" /etc/passwd # 从单个文件中查找指定字符串
grep "root" /etc/pass* # 从多个文件中查找指定字符串
' 搜索时忽略大小写
grep -i "root" /etc/passwd
' 匹配整词
grep -w "root" /etc/passwd
' 显示不包含匹配文本的所有行
grep -v "root" /etc/passwd
' 递归搜索 不仅搜索当前目录 而且搜索子目录
grep -r "root" ./
' 列出所有匹配行,并显示行号
grep -n "root" /etc/passwd
' 只输出匹配行数量
grep -c "root" /etc/passwd
' 结合正则表达式匹配
grep -E "[1-9]" test.txt # 显示文件中包含数字的行
实例
' 从单个文件中查找指定字符串
grep "root" /etc/passwd
' 从多个文件中查找指定字符串
grep "root" /etc/passwd /etc/shadow /etc/gshadow
' 输出文件中以root开头的行
grep ^root /etc/passwd
' 输出文件中以bash结尾的行
grep bash$ /etc/passwd
' 输出文件中以root开头 bash结尾的行
grep "root.*bash" /etc/passwd
' 同时查找两个指定字符串
grep -e "wangj" -e "root" /etc/passwd
' 查找指定进程
ps -ef | grep zabbix
' 查找指定进程数量
ps -ef | grep -c zabbix
' 用 GREP_OPTIONS 使匹配项醒目
vim ~/.bashrc
export GREP_OPTIONS='--color=auto' GREP_COLOR='100;92'
source ~/.bashrc
SED
命令格式
sed [参数] "[定位][指令]" ' 注: 不指定定位 则默认处理全文
参数
-e :允许多项编辑
-n : 取消默认输出
-i : 就地编辑文本
-r : 支持扩展正则表达式(sed中的正则表达式必须放在两个//中间)
-f : 指定定位规则的文件
定位
正则表达式
^ ^word 搜索以word开头的内容
$ word$ 搜索以word结尾的内容
. 代表且只能代表任意一个字符(不匹配空行)
* 重复之前的字符或文本0个或多个,之前的文本或字符连续0次或多次
\ 转义字符,让有特殊含义的字符脱掉马甲,现出原形,如\.只表示小数点
指令
p : 打印
d : 删除
a : 在当前行后添加一行或多行内容
c : 用新文件修改(替换)当前行中的文本
i : 在当前行之前插入文本
r : 从以外文件中读相关内容,写到相关行之后
w : 匹配到的行写入一个新的文件之中
y : 将字符转换成一个新的字符
s : 用一个字符替整体替换成另外一个字符
g : 全局执行
i : 与s指令配合一起使用时,则是忽略大小写的作用
参考
' 删除每行第一个字符
sed -r 's/^.//g' /etc/passwd
' 删掉每行第二个字符
sed -r 's/^(.)(.)/\1/g' /etc/passwd
' 删掉每行最后一个字符
sed -r 's/.$//g' /etc/passwd
' 取消一行的注释
cat cas.properties | sed '/Oracle10gDialect$/ s/^#//g'
' 给某行增加注释
cat cas.properties | sed -r '/MySQLDialect$/ s/^(.)/#\1/g'
' 在每行的最后增加文本
sed 's/$/& pass/g' cas.properties
' 只打印 1.txt 的第一行与第五行
sed -n -e "1p" -e "5p" 1.txt
' 删除 1.txt 的第三行
sed -i "3d" 1.txt
' 删除 /etc/fstab 文件中所有注释行
sed -i -r "/^ *#|^$/d" /etc/fstab
' 删除文件 所有以#开头的行
sed -r "/^ *#/d" filename
' 删除文件 第一行至包含test行之间的全部内容
sed -r "1,/test/d" filename
' 删除文件 包含root行至第五行之间的全部内容
sed -r "/root/,5d" filename
'删除文件 包含root行至包含ftp行之间的全部内容
sed -r "/root/,/ftp/d" filename
' 在文件的第二行往后添加一行内容
sed "2a wangj" filename
' 替换某行内容
sed "3c WANGJ" filename
' 在文件的第三行之前插入内容
sed "3i wangj" filename
' 将字符替换为一个新的字符
sed "s/sbin/1234/g" /etc/passwd # g 全局执行
sed "s/ROOT/1234/i" /etc/passwd # i 忽略大小写
' 将/etc/passwd文件信息输入至1.txt | 删除包含/sbin/nologin的行 | 查看 1.txt
cat /etc/passwd > 1.txt | sed -i -r "/\/sbin\/nologin/d" 1.txt | cat 1.txt
实战
# 将 IP 192.168.15.200 替换为 192.168.15.50
sed "s/\.200/\.50/g" /etc/sysconfig/network-scripts/ifcfg-eth
# 删除文件中的所有奇数行
sed "1~2d" filename
# 删除文件中的所有偶数行
sed "1~2! d" filename
# 在文件每一行行首增加 #号
sed "s/^ */#/g" filename
# 在文件每一行行尾添加 .bak
sed -r "s/(.*)/\1\.bak/g" filename
# 将 Hello World 替换成 World Hello
sed -r "s/(Hello) (World)/\2 \1/g" filename
AWK
awk '{print $2}'
CUT
命令格式
cut [参数] [文件名]
参数
-c 以字符为单位进行分割
-d 指定分隔符
-f 指定输出区域
示例
' 以字符为单位进行分割 '
echo "hello world" | cut -c 4
l
echo "hello world" | cut -c 6
echo "hello world" | cut -c 7
w
echo "hello world" | cut -c 1-5
hello
echo "hello world" | cut -c 1,5
ho
' 随机生成8位数的密码 '
echo $RANDOM
21519
echo $RANDOM | md5sum
9ad02cdb5bc498597a5dbed7c0949909 -
echo $RANDOM | md5sum | cut -c 1-8
8bfb7d09
' 指定分隔符 '
cat /etc/passwd | cut -d ":" -f 1
cat /etc/passwd | cut -d "/" -f 5