shell字符串处理命令小结

时间:2022-04-16 21:04:41

一、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]"`