linux shell 字符串截取_shell截取最后一个字符

linux shell 字符串截取_shell截取最后一个字符因最近工作中,用到shell脚本,刚开始感觉难度比较大,但在查阅资料后,感觉也没啥难度;后续整理工作中遇到的脚本知识点;现将遇到的问题,整理如下:遇到问题:需要根据关键字,截取其定义的内容;比如截图宏定义的值,或者截取某行中最后一列数据;如下为查阅网络资料后,整理针对该问题,整理字符串截取操作如下:一、字符串截取:1.如题想提取文本中在[]之前的字符,字符与[]之间有空格;比如文本:    TF…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

因最近工作中,用到shell脚本,刚开始感觉难度比较大,但在查阅资料后,感觉也没啥难度;

后续整理工作中遇到的脚本知识点;现将遇到的问题,整理如下:

遇到问题:需要根据关键字,截取其定义的内容;比如截图宏定义的值,或者截取某行中最后一列数据;


如下为查阅网络资料后,整理针对该问题,整理字符串截取操作如下:

一、字符串截取:

1. 如题想提取文本中在[]之前的字符,字符与[]之间有空格;

比如文本:

    TFII-I [T00824]; 6

    Pax-5 [T00070]; 7

    p53 [T00671]; 7

执行效果:最后得到

    TFII-I

    Pax-5

处理脚本:

1)使用grep:

[root@zll zll]# echo “TFII-I [T00824]; 6” | grep -oP “[^\[]+(?=\[)”

TFII-I 

[root@zll zll]# 

2)使用awk:

[root@zll zll]# echo “TFII-I [T00824]; 6” | awk ‘{print $1}’

TFII-I

[root@zll zll]# 

3)使用sed:

[zll@zll ~]$ echo “TFII-I [T00824]; 6” | sed ‘s/ .*$//’

TFII-I

[zll@zll ~]$ 

解释说明:


2. linux-awk中NF与$NF的区别:


NF       表示的是浏览记录的域的个数 
$NF     表示的最后一个Field(列),即输出最后一个字段的内容

[root@localhost SHELL]# free -m | grep buffers\/

-/+ buffers/cache:       1815       1859

[root@localhost SHELL]# free -m | grep buffers\/ |
awk ‘{print $NF}’

1859

[root@localhost SHELL]# free -m | grep buffers\/ |
awk ‘{print NF}’

[root@localhost SHELL]# 

3. cut截取字符串:(适用于含有空格的字符串)

可通过sed命令 获取该行后,再通过cut命令截取某列;

cut -f 2 file.txt # 表示截取第2列


cut -f 2,4 file.txt        # 表示截取第2,4列

https://www.centos.bz/2017/09/shell%E4%B8%AD%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%88%AA%E5%8F%96%E5%91%BD%E4%BB%A4%EF%BC%9Acut%EF%BC%8Cprintf%EF%BC%8Cawk%EF%BC%8Csed/

shell中字符串截取命令:cut,printf,awk,sed

一、cut

1、选项

2、使用

二、printf

1、输出类型

2、输出格式

三、awk

1、命令

2、条件(pattern):一般使用关系表达式作为条件

3、动作(Action)

4、例子

5、说明

四、sed

1、命令

2、选项

3、动作:(要加双引号)

4、例子

一、cut
cut 命令不能在分割符是空格的字符串中截取列,只能是 制表符 或 具体的分割符。
1、选项


-b :仅显示行中指定直接范围的内容;

-c :仅显示行中指定范围的字符;

-d :指定字段的分隔符,默认的字段分隔符为”TAB”;

-f :显示指定字段的内容;

-n :与”-b”选项连用,不分割多字节字符;

–complement :补足被选择的字节、字符或字段;

–out-delimiter=<字段分隔符> :指定输出内容是的字段分割符;

–help :显示指令的帮助信息;

–version :显示指令的版本信息。



2、使用



-d :分隔符 ( –delimiter 按照指定分隔符分割列 )

-b : 表示字节

-c : 表示字符


-f : 表示字段(列号) ( –field 提取第几列 )

N- : 从第N个字节、字符、字段到结尾

N-M : 从第N个字节、字符、字段到第M个

-M : 从第一个字节、字符、字段到第M个

$> cat user.txt

01, zhang, M, 18

02, wang, M, 20

03, li, M, 21

# 以”,”分隔,显示第二列
$> cut -d “,” -f 2 user.txt


 zhang

 wang

 li

# 以”,”分隔,显示第1列和第3列
$> cut -d “,” -f 1,3 user.txt


01, M,

02, M,

03, M,

# 以”,”分隔,显示第1-3列

$> cut -d “,” -f 1-3 user.txt

01, zhang, M,

02, wang, M,

03, li, M,

# 以”,”分隔,显示除第1列以外的其他列

$> cut -d “,” -f 1 –complement user.txt

 zhang, M, 18

 wang, M, 20

 li, M, 21

## 注意前面是有空格的!

###### 字符串

$> cut -c1-5 user.txt

01, zh

02, wa

03, li

(cut 命令不能在分割符是空格的字符串中截取列,)

注意:sed可以根据关键字获取某文件中的  该关键字的一行数据;


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

1、输出类型


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

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

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

2、输出格式

\a : 输出警告声音


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

\f : 清除屏幕


\n : 换行
\r : 回车,也就是Enter键
\t : 水平输出退格键,也就是Tab键


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

printf %s 1 2 3 4 5 6 # 把123456当成一个字符串输出,没有格式

printf %s %s %s 1 2 3 4 5 6 # 把%s%s123456当做字符串输出,没有格式

printf ‘%s ‘ 1 2 3 4 5 6 # 把1 2 3 4 5 6当做字符串输出,输出格式为空格

printf ‘%s\n’ 1 2 3 4 5 6 # 输出格式为1个一行

printf ‘%s %s %s’ 1 2 3 4 5 6 # 把内容当做字符串三个为一组输出,1 2 34 5 6

printf ‘%s %s %s\n’ 1 2 3 4 5 6 # 输出格式为3个一行

printf ‘%s’ $(cat user.txt) # 输出文本内容为字符串

printf ‘%s\t %s\t %s\t %s\n’ $(cat user.txt)  # 把文本内容格式化输出


建议 man printf 查看可用的输出格式,和C的 printf 格式一样。

三、awk
1、命令

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


( 如果条件1,执行动作1;如果条件2,执行动作2 )

2、条件(pattern):一般使用关系表达式作为条件

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

x >= 10 : 大于等于

x <= 10 : 小于等于

3、动作(Action)
格式化输出
流程控制语句

4、例子

# 大括号前面没有条件,直接执行命令,
这里的printf 是awk的命令,$2 提取文件第二列,$3 提取文件第三列,$0 提取所有列
awk ‘{printf $2 “\t” $3″\n”}’ user.txt

# 打印三列,这里的print是awk的命令,系统并没有print命令,所以只能在awk里使用;

与printf的区别是:print会自动在行尾加换行符,而printf不会;

df -h | awk ‘{print $1 “\t” $5 “\t” $6 “\t”}’

# 提取系统已使用硬盘空间,可以把结果赋给一个变量,判断是否大于某个值,进行报警

df -h | grep sda3 | awk ‘{print $5}’ | cut -d ‘%’ -f 1

# 查看剩余内存不包含单位M

free -h | grep Mem | awk ‘{print $4}’ | cut -d ‘M’ -f 1

5、说明


grep 取行,awk 按条件取指定列,cut 按分隔符取指定列。

BEGIN:先执行一条多余的动作

awk ‘BEGIN{print “this is a text”} {print $2 “\t” $3}’ user.txt

END:用于在所有命令处理完之后执行

FS内置变量:用于定义分割符,如果需要手工定义分割符,一定要在分割符前面加BEGIN;

awk ‘BEGIN{FS=”:”} END{print “this is end text”} {print $1 “\t” $3}’ /etc/passwd

BEGIN、END也是条件。

关系运算符:

# user.txt中不包含ID这行,提取满足条件为第四列值大于18的第二列

cat user.txt | grep -v ID | awk ‘$4 > 18 {printf $2 “\n”}’

四、sed
sed主要是用来将数据进行选取、替换、删除、新增的命令。可以放在管道符之后处理。


1、命令

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

sed命令有两种形式:sed [options] ‘command’ file(s);sed [options] -f scriptfile file(s)

2、选项


-n : 一般sed命令会把所有数据都输出到屏幕;如果加入此选项,则只会把经过sed命令处理的行输出到屏幕。

        sed -n ‘2p’ user.txt # 输出第二行

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

-f : 添加脚本文件的内容到执行的动作


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

3、动作:(要加双引号)

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

`c` : 行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需要用”\”代表数据未完结。

`i` : 插入,在当前行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要用”\”代表数据未完结。

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

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

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

4、例子


sed -n ‘2p’ user.txt        # 输出第二行, p一般都要和-n使用,不-n会显示出所有的行

df -h | sed -n ‘2p’          # 管道符结果作为操作内容

sed ‘2,4d’ user.txt        # 删除文件的第2行到第4行,显示剩下的行,
没有加 i 选项,不会更改文件内容

sed ‘2a hello’ user.txt      # 在第二行后追加hello,仅仅修改命令输出

sed ‘2i hello \

  world’ user.txt        # 在第二行前插入两行数据,仅仅修改命令输出

sed ‘2c No person’ user.txt    # 把第二行替换为No person

sed ‘2s/M/F/g’ user.txt      
# 把第二行的M替换为F后输出

sed -i ‘2s/M/F/g’ user.txt  # 把替换后的结果写入文件

sed -e ‘s/zhang//g ; s/wang//g’ user.txt    # -e 允许多条命令顺序执行,用分号隔开,s前面不加数字表示所有行

原文出处:简书 -> http://www.jianshu.com/p/1bbdbf1aa1bd


一、Gnu Linux shell 截取字符变量的前8位,有方法如下:

1.expr substr “$a” 1 8

2.echo $a|awk ‘{print substr(,1,8)}’

3.echo $a|cut -c1-8

4.echo $

5.expr $a : ‘\(.\\).*’

6.echo $a|dd bs=1 count=8 2>/dev/null

 


二、按指定的字符串截取

1、第一种方法:

${varible##*string} 从左向右截取最后一个string后的字符串

${varible#*string} 从左向右截取第一个string后的字符串

${varible%%string*} 从右向左截取最后一个string后的字符串

${varible%string*} 从右向左截取第一个string后的字符串

“*”只是一个通配符可以不要、

例子:

复制代码 代码如下:


$ MYVAR=foodforthought.jpg
$ echo ${MYVAR##*fo}
rthought.jpg

$ echo ${MYVAR#*fo}

odforthought.jpg

2、第二种方法:${varible:n1:n2}:截取变量varible从n1到n2之间的字符串。

可以根据特定字符偏移和长度,使用另一种形式的变量扩展,来选择特定子字符串。试着在 bash 中输入以下行:

复制代码 代码如下:


$ EXCLAIM=cowabunga
$ echo ${EXCLAIM:0:3}
cow

$ echo ${EXCLAIM:3:7}

abunga

这种形式的字符串截断非常简便,只需用冒号分开来指定起始字符和子字符串长度。

 


三、按照指定要求分割:

比如获取后缀名

复制代码 代码如下:


ls -al | cut -d “.” -f2

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/188658.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号