linux按括号截取字符串,shell字符串截取总结

shell中截取字符串的方法有很多中,本人对其中几种常用的进行整理总结。

0x01、grep

在文件中搜寻字符串匹配的行并输出

Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

grep 【选项】【指定字串】【文件】

-i 不区分大小写

-v 排除指定字串

-c:只输出匹配行的计数。

-n:显示匹配行及 行号。

-s:不显示不存在或无匹配文本的错误信息。

grep支持正则表达式,下面总结下正则表达式和通配符。

正则表达式

正则表达式用来在文件中匹配符合条件的字符串,正则表达式是包含匹配。grep、awk、sed等命令可以支持正则表达式。

通配符

通配符用来匹配符合条件的文件名,通配符是完全匹配,ls、find、cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配。

正则有些符号和通配符有些符号通用,但含义完全不同

基础正则表达式元字符作用

*前一个字符匹配0次或任意多次

.匹配除了换行符外任意一个字符

^匹配行首。如^hello会匹配以hello开头的行

$匹配行尾,如hello会匹配以hello结束的行

[]匹配中括号中任意的一个字符,只匹配一个字符。

[^]匹配除中括号的字符以外的任意一个字符。如[^0-9]匹配任意一个非数字字符

\转义符。用于取消特殊符号的含义

{n}n是一个非负数,匹配前面的字符恰好出现n次。如o{2}匹配food中的两个o

{n,}表示其前面的字符出现不少于n次

{n,m}最少匹配n次且最多匹配m次

需要注意的是,通配符的*表示任意字符,而正则表达式的*是匹配钱一个字符0次或者任意多次

grep "s*" anaconda-ks.cfg  显示的不是包含有s的行,而是显示了整个文件,“s*”匹配s的0次或多次

73a8baa64e13be1d5b71f109898f224c.png

grep "size*" anaconda-ks.cfg匹配了e的0次或多次,但至少需匹配siz字符串

78dcd3f9713c4b649e09e239a7aa9cc5.png

“.”匹配除了换行符外任意一个字符,和通配符的?相同,“.*”就才和通配符中的“*”作用相同

grep提取行,cut和awk提取列

0x02、cut

cut是一个选取命令,就是将一段数据经过分析,取出我们想要的。一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的

cut[选项]文件名

-f列号提取第几列

-d分隔符按照指定分隔符分割列(默认使用的是制表符tab键)

a293745f0689c77a32690561a3eafa6b.png和grep结合使用,cat /etc/passwd | grep /bin/bash | grep -v root | cut -d":" -f 1

65d3bafbb5ac6635449a23cd04588299.png

cut命令的局限线

cut命令对于空格符分割,不能很好的提取,可以使用awk命令解决

0x03、awk

和cut命令作用一样,截取符合条件的列,grep是截取符合条件的行,但cut有些局限,awl也可以通过制表符,冒号等分隔符截取,功能远比cut强大,但awk是一个非常复杂的命令,不但可以实现字符串的截取,还可以在awk命令中进行编程调用,最常见的可以进行函数,判断等。所以把awk一直说是awk编程。但仅仅是简单的截取列,又不是用空格作分割的话,cut命令更简单。

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk ‘条件1{动作1}条件2{动作2}...’文件名

条件

一般使用关系表达式作为条件

x>10判断变量x是否大于10

x>=10大于等于

x<=10小于等于

动作

格式化输出

流程控制语句

b082d26b7e5726a49d98a34c876ae37b.png

$1代表第一列,$2代表第二列,$0代表整一行

FS内置变量awk '{FS=":"}{print $1"\t" $3}' /etc/passwd,使用FS=””,指定分割符,第一行已经读完,用冒号分割已经来不及了,默认的用空格分割,后面的用冒号分割,在

FS之前强制加个BEGIN

a700a041a19200e1876e6ca959c2be54.png

关系运算符

cat /etc/passwd | awk '{FS=":"} $3>=500 {printf $1"\n"}'

a6292e51c90754a1fa6c7201be87a79e.png

0x04、printf

printf是在awk中的标准输出格式

printf ‘输出类型输出格式’输出内容

输出类型:

%ns:输出字符串,n是数字指代输出几个字符

%ni:输出是整数,n是数字指代输出几个数字

%m.nf:输出浮点数。m和n是数字,指代输出的整数位数和小数位数。加%8.2f代表共输出8位数,其中2位是小数,6位是整数。

输出格式:

\a:输出警告声音

\b:输出退格符,也就是backspace键

\f:清楚屏幕

\n:换行

\r:回车,也就是Enter键

\t:水平输出退格键,也就是Tab键

\v:垂直输出退格键,也就是Tab键

87626122edb982332f52be7c15c27b75.png

在awk命令的输出中支持print和printf命令

print:print会在每个输出之后自动加入一个换行符(linux默认没有print命令)

printf:printf是标准格式输出命令,并不会自动加入换行符,如果需要换行,需要手工加入换行符。

0x05、sed

sed是一种几乎包括在所有unix平台(包括linux)的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令。

vim也可以进行选取,删除,替换等,但是vim只能对文件进行修改,但是不可以直接对命令的结果进行修改,需先把命令保存到文件中,再对文件进行修改。而sed可以从管道符接收数据进行修改

73023eb43a2b8c8b0fa7328d83db7c3e.png

sed [选项]‘[动作]’文件名

常见选项

-n一般sed命令会把所有数据都输出到屏幕,加入此参数,则只会把经过sed命令处理的行输出到屏幕

-e允许对输入数据应用多条sed命令编辑

-i用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出

动作:

a\:追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用“\”代表数据未完结。

c\:行要用\”代表数据为完结。

替换,用c后面的字符串替换原来数据行,替换多行时,除最后一行外,每行末尾需i\:插入,在当前行前插入一行或多行,插入多行时,除最后一行外,每行末尾需要用\”代表数据为完结。

d:删除,删除指定的行。

p:输出、打印指定的行。

s:字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/旧字串/新字串/g”(和vim中的替换格式类似)。

sed -n "1p" /etc/passwd ,查看etc/passwd中的第一行,如果不加-n参数,显示这条操作外,还会显示文件的全部内容,加-n

只会显示处理的行

6e96ca8804fb3480816f6826bcb4a254.png

sed "2,36d" /etc/passwd ,删除第二行到第四行的数据,但不修改文件本身,只有加了-i参数才会修改文件本身

89332a401c33b042310f9019ed743be5.png

动作a和i都是添加,a是追加在行尾,i是插入在行前,但不都会修改文件本身,只会先显示上做修改,不加-n除了虎显示修改的数据,还会显示文本的所有数据。

09f1b49a6fa9c62e79fd3720c6267142.png

4ae90b596c76731bbeba291af362c94c.png

动作c和动作s都是进行替换,c进行的是行的替换,s进行的是字符串的替换,字符替换的格式是sed“s/旧字符串/新字符串/g”文件名,在s前指定行只需改指定的行,不指定会修改所有的。

67d8c6dcaf3c5260a592bd27994e4d65.png

d0c6c3318b61ed42df32a197b6bac263.png

0x06、sort 排序命令

sort 【选项】 文件名

选项

-f忽略大小写

-n以数值型进行排序,默认使用字符串排序

-r反向排序

-t指定分隔符,默认使用的是制表符tab键

-k n[,m]按照指定的字段范围排序,从第n字段开始,m字段结束,不加m默认到行尾

aa239741db1d827fa7f70f41a78c6851.pngsort -t ":" -k 3,3 /etc/passwd,仔细看,没把uid当作字符串对待,而当数值型对待,需要加-n参数

2ec84fb170682140a108bffaaa986a72.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值