shell字符串处理命令小结

本文介绍Linux下的文本处理工具grep、sed及tr的基本使用方法。grep用于搜索匹配特定字符串的行;sed则提供了强大的文本编辑功能,如行筛选与字符串替换等;tr用于过滤或转换字符。这些工具常用于日常脚本编写和日志分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

Shell脚本中,我们可以使用不同的方法来判断字符串是否包含。其中一种常用的方法是使用grep命令进行查找。我们可以通过将待查找的字符串作为grep的参数,并使用管道将待查找的字符串传递给grep命令,然后根据grep的输出结果来判断是否包含。例如,可以使用以下代码来判断字符串strA是否包含字符串strB: ``` strA="long string" strB="string" result=$(echo $strA | grep "${strB}") if [[ "$result" != "" ]] then echo "包含" else echo "不包含" fi ``` 在这个例子中,我们首先将字符串strA传递给echo命令,然后将其输出通过管道传递给grep命令,并使用双引号将待查找的字符串strB括起来,以确保在比较时不会受到特殊字符的影响。如果grep命令返回的结果不为空,则表示字符串strA包含字符串strB,否则表示不包含。在这个例子中,输出将是"包含"。 另外,在Shell脚本中,我们还可以使用双方括号[[ ]]来进行字符串的比较操作。双方括号支持字符串的模式匹配,并提供了更多的比较选项。使用`=~`操作符时甚至支持shell的正则表达式。可以将右边的字符串视为一个模式,而不仅仅是一个字符串。例如,可以使用以下代码来判断字符串strA是否包含字符串strB: ``` strA="long string" strB="string" if [[ $strA == *"$strB"* ]] then echo "包含" else echo "不包含" fi ``` 在这个例子中,我们使用双方括号[[ ]]来比较字符串strA和模式*"$strB"*,如果strA中包含字符串strB,则条件为真。输出将是"包含"。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Shell判断字符串包含关系的方法小结](https://blog.youkuaiyun.com/zbw18297786698/article/details/77455599)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [探索shell中[ ]和[[]]的区别](https://blog.youkuaiyun.com/chen1415886044/article/details/109018993)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值