一、grep
grep用来简单地查找文本文件中匹配某字符串的行。
grep string filename
选项-i的意思是忽略string大小写,-r的意思是递归地进行所选的所有文件。
二、sed
sed是一个强大的命令,这里只记录常用的。
sed command_string filename
选项-n的意思是关闭sed的默认输出,-i的意思是允许sed对filename进行inplace的改动。
1. sed进行字符串匹配行筛选。
例如筛选有port字符串的对应行
sed -n "/port/p" filename
p的意思是打印出匹配行,如果是匹配仅在行首的port,则是"/^port/p"。
2. sed进行字符串替换
sed -i "s/old_string/new_string/g" filename
filename中所有old_string都会被替换为new_string。
有一个小技巧,如果我们要替换的字符串是文件路径的时候,会有/包含在里边,这时就会比较麻烦,我们可以改成
这样
sed -i "s|old_string|new_string|g" filename
3. sed对指定一些行操作
对指定一些行匹配
sed -n "/^haha/,+5 {/hehe/p}" filename
这个命令的含义是先确定haha开头的行,然后在后边的五行内匹配有hehe的行。
对指定一些行进行修改
sed -i "/^haha/,+5 s/old_string/new_string/g" filename
三、tr
tr -cd "string" 可以用来过滤标准输入中不在string中的字符。
比如
echo "1234asdfsdf" | tr -cd "abcd"
的结果是add。
四、关于数字的查找和提取
查找比较方便,我们以端口配置为例吧
sed -n "/port=[0-9]\+/p" filename
就会打印出filename中所有有port=12343类似格式的行打印出来。
但是想要提取就得联用tr -cd了。
sed -n "/port=[0-9]\+/p" filename | tr -cd "[0-9]"
比如我们想要在shell中提取haha_server下配置中port的具体数值,就可以在shell中这样写
PORT=`sed -n "/^haha_server/,+5 {"/port=[0-9]\+/p}" filename | tr -cd "[0-9]"`