Linux_字符串处理
一、正则表达式常用符号
符号 | 含义 |
---|---|
^ | 匹配字符串开始位置的字符 |
$ | 匹配字符串结束位置的字符 |
. | 匹配任何一个字符 |
* | 匹配前面的字符出现 0~n 次 |
[a,m,u] | 匹配字符 a 或 m 或 u |
[a-z] | 匹配所有小写字母 |
[A-Z] | 匹配所有大写字母 |
[a-zA-Z] | 匹配所有字母 |
[0-9] | 匹配所有数字 |
\ | 特殊符号转义 |
二、basename
返回路径字符串中的资源(文件或目录本身)部分
用法:
base [文件或者目录]
如果指定了后缀,basename 会帮我们把后缀部分也去掉
base [文件或者目录] .[后缀名]
测试:
三、dirname
返回路径字符串中的目录部分
用法:
dirname [文件或者目录]
四、cut
根据指定符号拆分字符串并提取。默认根据 \t 拆分。
- -f 参数:指定要提取的列
- -d 参数:指定拆分依据的字符
准备测试数据:
1 | vim cut.txt |
1 | guang,shen |
切割提取第一列:
1 | cut -d "," -f 1 cut.txt |
结果:
guang
dong
wo
lai
le
切割提取第二、第三列:(一共 3 列)
1 | cut -d "," -f 2,3 cut.txt |
结果:
shen
zhen
,wo
,lai
,le
在 cut.txt 中切出 guang”:
1 | cat cut.txt | grep "guang" | cut -d "," -f 1 |
选取系统 PATH 变量值,第 2 个 “:” 开始后的所有路径:
1 | echo $PATH | cut -d : -f 2- |
切割 ifconfig 后打印的 IP 地址:
1 | ifconfig | grep "netmask" | cut -d "i" -f 2 | cut -d " " -f 2 |
另一种做法:
1 | ifconfig | grep netmask | cut -d " " -f 10 |
五、awk
一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
1、基本用法
awk [选项参数] ‘pattern1{action1} pattern2{action2} …’ filename
pattern:表示 AWK 在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令
使用-F 参数指定分隔符。
awk 命令的内置变量包括:
变量名 | 说明 |
---|---|
FILENAME | 文件名 |
NR | 已读取的记录 |
NF | 浏览记录的域的个数(切割后,列的个数) |
2、测试
准备数据:
1 | cp /etc/passwd ./ |
测试:
1 | # 搜索passwd文件以root关键字开头的所有行,并输出该行的第7列 |
如果命令很长,可以使用反斜杠换行输入
六、sort
sort 命令是在 Linux 里非常有用,它将文件进行排序,并将排序结果标准输出。
参数名 | 作用 |
---|---|
-n | 依照数值大小排序 |
-r | 相反顺序排序 |
-t | 设置排序时使用的分隔字符 |
-k | 指定需要排序的列 |
准备数据:
1 | vim sort.txt |
1 | cc:33:3.33 |
测试:
1 | sort -t : -nrk 3 sort.txt |
七、xargs
某目录下包含下列资源:
用一条命令删除所有名称中包含“txt”的资源,但是保留 txt2
分步实现
1、列出全部资源
1 | ls |
2、列出名称中包含“sad”的资源
1 | ls | grep txt |
3、进一步筛选排除 sad02
1 | ls | grep txt | grep -v txt2 |
此时最终筛选的结果打印到了标准输出:standard output。通过管道符号可以将标准输出转换为标准输入:standard input。
但是删除命令 rm不接受标准输入作为参数,只接受命令行参数。
rm 命令前面的管道符号把前面的 stdout 转换为了 stdin 再传输给 rm 命令,这种方式对于有些命令可以,但是有些命令不行。例如:mkdir、ls、rm 等命令都是。
在 linux 中,经常需要各种命令,通常情况下都会带各种参数,就是命令行参数。
rm -rf test
-rf test 就是命令行参数
4、使用 xargs 命令将 stdin 转换为命令行参数
1 | ls | grep txt | grep -v txt2 | xargs rm |
xargs 命令的作用:将管道符号提供的 stdin 数据 转换为后面命令的命令行参数。
八、面试真题
1、问题 1
使用 Linux 命令查询 file1 中空行所在的行号
1 | awk '/^$/{print NR}' file1.txt |
2、问题 2
有文件 chengji.txt 内容如下:
1 | 张三 40 |
使用 Linux 命令计算第二列的和并输出
1 | cat chengji.txt | awk -F " " '{sum+=$2} END{print sum}' |
3、问题 3
Shell 脚本里如何检查一个文件是否存在?如果不存在该如何处理?
1 |
|
4、问题 4
用 shell 写一个脚本,对文本中无序的第一列数字排序,并输出和
1 | sort -n test.txt|awk '{a+=$1;print $1}END{print "SUM="a}' |
5、问题 5
请用 shell 脚本写出查找当前文件夹(/home)下所有的文本文件内容中包含有字符”shen”的文件名称
1 | grep -r "shen" /home | cut -d ":" -f 1 |