linux 中如何截取2个字符串中间的字符?

在shell脚本中我们所有变量的存储形式都是字符串。所以对于字符串的截取来说就变得十分重要了。

而在shell脚本中,如果想要对一个字符串进行指定的截取,有多种方法可以来完成:

${STR##*char} 表示从左开始删除最后一个char左边的所有字符,截取右边的字符串

${STR%char*} 表示从右开始删除第一个char右边的所有字符,截取左边的字符串

同样*可以看做是通配符,表示匹配右边所有的字符删除,保留左边;

${STR%char*} 表示从右开始删除最后一个char右边的所有字符,截取左边的字符串

表示从左边第3个字符开始截取后面的8个字符;如果N为0表示从第一个字符开始,但是包括第一个字符;

${STR:N}  表示从左边第N个字符开始截取后面所有的字符,不包括第N个字符

表示从左边第7个字符开始取后面的所有字符;

表示从右边开始数第7个字符开始,包括第七个字符本身,截取三个字符;

空格在行首的同时不输出。其他字符是输出的,大家可以下去试一试是否包含他本身

${STR:0-N}  表示从右边第N个字符开始截取后面的所有字符,包括第N个字符

表示从右边开始数第7个字符开始截取后面的所有字符;

空格不输出。其他字符是输出的,大家可以下去试一试是否包含他本身

表示截取从左边数第7个字符;

表示从截取从左边第7个字符开始剩下的所有字符;

表示截取从左边第2个字符到第7个字符之间的所有字符,包括第2个字符,不包括第7个字符;

表示从左边第7个字符开始数删除后面所有的字符,截取前面的字符;

因为expr是命令,所以上面的$()为命令替换,表示截取从左边第3个字符开始往后截取5个字符;

}

Linux 的字符串截取很有用。有八种方法。

7. 从右边第几个字符开始,及字符的个数

其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。

8. 从右边第几个字符开始,一直到结束。

表示从右边第七个字符开始,一直到结束。

注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)

}
 

printf '输出类型输出格式' 输出内容

由此可以,printf是一个格式类型加计算过程的顺序

%ns (string)输出字符串,n是数字代表输出几个字符

%ni (int)输出整数。 n是数字代表输出几个数字

%n.mf (float)输出浮点数,n代表总位数,m代表小数位

\t 输出制表符,即tab键

printf 命令输出文件内容

这样看起来很乱只能通过制表符隔开,格式化输出printf可以识别制表符分隔符

printf不识别管道符之后会联系awk命令,此时想要去除第一行字符,先print,grep 写在管道符之后,如下图

局限性:只能提取行,不能提取列

-w 以单词为单位进行过滤
-A 过滤字符所在行以及其下几行(可以指定数字)
-B 过滤字符所在行以及其上几行
-C过滤字符所在行以及其上下几行

awk基本使用(行列都可以处理)

awk 选项(-F指定分隔符) 'BEGIN {操作} 匹配模式{动作1} 匹配模式{动作2}…… END {操作}' 文件名(匹配模式和动作用大括号区分,多个匹配模式中间用空格隔开)

printf(需要输入”\n“自动换行符)
print(不需要输入换行符可以自动换行)

awk可以提取空格和制表符为分隔符的内容

查看磁盘使用百分率,并将%去掉(以%为分隔符取第一列)

awk的选项-F 指定分隔符

若果想要打印2列用“,(默认以空格作为分隔符)”或者双引号指定分隔符
如果想要在分隔符中间再添加其他分隔符,双引号和单引号交替使用,可以再次调用变量为分隔符
一行一行处理,一个字段一个字段处理并输出:如果有BRGIN先执行BRGIN,之后讲第一行所有数据赋给$0,然后第一行第一列赋给$1第二列赋给$2······直到第一列全部赋值完成后,,如果需要输出,先把第一行满足条件的列输出。在将整个第二列赋值给$0,然后第二列的第一行赋值$1······最后执行END结束
如果有匹配模式,进行匹配,匹配成功执行操作,不成功,读取下一行
BRGIN :在awk程序一开始时,尚未读取的任何数据之前执行,只在程序开始时执行一次(用于手工指定分隔符)

在输出之前先输出个11111

END :在awk程序处理完所有数据,即将结束执行。END后的动作只在程序结束时执行一次

如果每一行列相同,可以交给‘END {print NF}’去处理,可以通过最后一行的列数统计处列数,但是如果不相同,则不能在END中统计

统计成绩大于等于86分的学生的名字(首先排除第一行,如果,第六行大于86,则输出第二行)

步骤:先判断有没有BEGIN,之后把第一行的数据附在aek中,把第一列,第二列......赋值在$1,$2......继续把第二行的数据赋值在AWK中......这样执行下去,哦按段也如此,先判断第一行的第6列是否大于86,在判断第二行的第六列是否大于86()

等于和不等于可以完全匹配字符,此时切记字符要加双引号

包含匹配字符串和完全匹配

A~B 判断字符串A中是否包含匹配B

判断第二列中名字包含Sc的学生的平均成绩(第六段)指定具体的某一列是因为防止一行中多个列都出现“Sc”字段

awk识别字符必须使用//包含字符串正则表达式

//支持正则可以使用通配符哦

如果一行没有重复的字段,无需怎加“$2~”包含符号

A!~B 判断字符串A中是否不包含匹配B

输出Lm的平均成绩(指定列更好)

awk在匹配模式和指定分的隔符都可以使用正则表达式
$0 代表awk所读入的整行数据(相当于不写)
$n 代表当前读入行第n列字段(第n列)
补充:cut默认只能以制表符作为空格,而awk默认可以以制表符和空格作为分隔符
NR 显示行号和NF当前拥有字段(列)数
由上图可知,虽然都正确输出,但是不够清晰,中间如果要加入制表符和相关解释说明的中文,要放入到双引号中

$NF代表打印的是最后一列

若每行列相同,统计列数可以交给END配合$NF处理

NR一般代用在匹配模式下,指定输出某行

指定打印第三行和第5行

FNR awk同时处理两个文件可以用到
由此可知,当NR>FNR时就可以判断,已经开始处理第二个文件
OFS指定输出的字段分隔符(默认为空格),输出时体现
ORS指定输出的记录分隔符,(即一个模块识别操作的分隔符,默认为换行符),输出时体现
写在BEGIN中指定分隔符()
FS 指定分隔符,默认是空格或者制表符(以废,同选项中的“F”)识别时起作用

如果不加BENGIN,会先把第一行读完,然后再指定分隔符已经晚了,第一行会被直接输出

看似cut更加简单,但是如果指定第三行uid必须为1000的用户,cut无法完成此条件截取,awk是这样截取的

RS指定读取记录分隔符,默认是换行符,识别时起作用
ENVIRON调用系统中的变量,不需要用$调用
ARGC命令参数的个数相当于shell中的 $
ARGV命令参数数组,相当于$@ $*
getline获取下一行(类似于sed中的N;)
获取行并模块化,getline之后$0变成了第二行,所以第一行的值必须用tmp保存

以N加分号配合换行符替代方式实现。为了方便记忆,在替换中所有-n和p一律省略

输出变量配合echo使用
求行字符长度为2的行,不要慌,放在条件中而已
split() 切割字符串化为数组形式处理
格式:split("字符串",数组名称,"分隔符") 按指定分隔符将字符串且各位数组
字符串替换(sub和gsub)
sub(gsub)(“需要被替换的字符”,“替换成的字符”,“要被替换的字段”)sub代表只替换一个字符,gsub代表本字段的所有字符都替换,指定输入哪个字段来表示,$0为整行全部替换
吧字符”0“替换成字符”?“,只替换第一行,然后输出整行
字符串格式化输出(输出格式和计算过程用逗号隔开)

print支持直接计算

例题1,截取stat中的权限
方法1(管道符分开截取)
方法2(正则匹配一步到位)

sed命令(选项都是英文,主要处理行)

sed(Stream Editor)流文件处理工具主要是用来将数据进行选取、替换、删除、新增,作用,替代vim的作用,不需要进行交互

格式:sed [选项] '地址 操作;地址 操作;······' 文件名(单引号中分号将多个部分隔开,地址和操作空格隔开)

sed命令将一行读取到模式空间(由上到下一行一行打印)
进行匹配,如果匹配成功,就执行操作,如果不匹配就丢弃,读取下一行
直到读取到文件最后一行
-n 只打印处理的行,多结合操作p一起(对比图:)
-i sed修改结果直接修改文件内容,而不是由屏幕输出
删除2-4行,并写入数据
将第三行和第四行删除并写入
可以直接在地址中加入分号进行多行操作

2p打印第二行 2,4p打印2到4行 2,$打印第二行到文件结尾(一般加-n)

使用正则/字符表达式/

此时和grep作用相似(包含匹配)

-r 让sed支持扩展正则

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

使用 “\”追加,怕自动换行导致单词失效 输出"\"回车自动换行输入

i 行插入,当前行前插入一行或多行。"\"作用同上
d 行删除,删除指定行

基本替换“c”(替换不需要-n和p了)

把第二行换成11111,第三行换成22222

sed局部替换(可用于截取字符串)

分隔符“/”或者“#”

第三段可以指定输出多段

卡之前和卡之后都要卡才能卡准

“/”作为分隔符的话需要用#,没有/做分隔符可以用“/”

例2:卡stat里面的权限

当然一口气划分好也可以

-n 读入下一行,上一行位于模式空间中的内容会被顶替掉(可以指定奇数行和偶数行)
N与上一行同时保持在模式空间(两行两行读取,和paste相似,每多写一个n就会多一行并入)配合替换使用

写两个N中间用;表示将后两行与第一行分成一个组

1.3. 所有文本处理大总结

paste 用于合并以及分行

-d 指定连接符,两行合并可以-d "符号/n"

join 若第一列相同则合并,其他列按照第一列的规则(行数)输出在后,否则不输出

}

我要回帖

更多关于 shell根据分隔符截取字符串 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信