Linux命令备忘实例(5)——切取命令

切取,顾名思义就是切割和取出满足我们需求的数据。这里的分类是个人使用后的一个人为划分,只是个人的一个理解。一般地,在使用shell命令处理和分析数据后,需要取出我们需要的部分,或者经由分析关键词取出需要的行。

1.cut

cut就是英文中的“切”,之所以这样命名,主要是这个命令是按照列来进行切分的,然后可以从待处理文件中取出指定的列(或者是字段、字符)。

1.概览

这里写图片描述
cut主要是对类似表格排布的文件(如csv等)的列的处理非常高效和方便。

2.特性和实例

最常用的就是指定字段分隔符,然后提取字段:

user@ubuntu:~$ cut -d ',' -f 3 test.csv
user@ubuntu:~$ cut -d ',' -f 3,5,7 test.csv

-f选项就是字段(field)选择,多个字段用逗号分隔,特别是可以使用范围表示来选择多列。

user@ubuntu:~$ cut -d ',' -f 4-6 test.csv
user@ubuntu:~$ cut -d ',' -f -2 test.csv
user@ubuntu:~$ cut -d ',' -f 4- test.csv

cut默认的字段分隔符是制表符,默认情况下,没有分隔符的行在切取的时候,会被原样输出不做任何切分。为了避免这种情况,可以使用-s选项将这样的行排除。

user@ubuntu:~$ cut -f 3 -s test.csv

另外还可以以字符或者字节来进行切分,此时只需要指定切分的位置或范围即可。下面是切分第10到16字节、和字符的内容

user@ubuntu:~$ cut -b 10-16 test.csv
user@ubuntu:~$ cut -c 10-16 test.csv

对于指定的字段、字节字符位置或范围的切分,可以使用长选项–complement来进行补集运算,这对于大量选择的时候非常有效,从反面指定不需要的字段即可选中需要的内容。

2.grep

grep是使用正则表达式进行切取或过滤文件的非常好用的工具。前文中cut是取出每一行中我们指定的需要部分,grep则是使用正则表达式来进行匹配,如果满足匹配条件则输出整行。

1.概览

在文件中进行搜索匹配,提取需要内容是非常重要的用例。grep是文本搜索的大师级工具,主要得益于能够接受正则表达式和通配符。
这里写图片描述
这里正则表达式的选项很多,主要是对正则表达式的种类以及一些限制。
另外,对匹配项的输出也可以有精确的控制:
这里写图片描述
对上下文也可以进行控制:
这里写图片描述
所有选项系统的控制是非常全面的。

2.常用实例

直接搜索字符:

user@ubuntu:~$ echo 'this is a line' | grep 'this'
this is a line
user@ubuntu:~$ grep 'this' file1, file2

grep命令如果要使用正则表达式,需要使用-E选项,表示使用扩展正则表达式,也可以使用egrep命令,等价于grep -E。如果需要只输出匹配到的部分,可以使用-o选项,-b选项是输出匹配到的内容在所在行的偏移值,一般斗鱼-o选项配合使用较好。-c选项可以查看匹配的行数,单一行内的多次匹配只统计一次。

user@ubuntu:~$ echo 'this is a line' | grep -E "[a-z]+"
this is a line
user@ubuntu:~$ echo 'this is a line' | grep -E -o "^[a-z]+"
this
user@ubuntu:~$ echo 'this is a line' | grep -E -c "[a-z]+"
1

由于-c选项只能查看匹配到的行数,因此可以使用如下技巧查看所有匹配的个数,另外可以使用-n选项查看匹配到的行所在行数。

user@ubuntu:~$ echo 'this is a line' | grep -E -c "[a-z]+"
4

3.扩展

递归搜索文件:如果需要在多级目录中对文本进行递归搜索,可以使用 :

user@ubuntu:~$ grep "content" /dir -R -n

这个选项用来在指定的项目文件夹下进行递归查询,非常有利于开发人员进行查找,寻找所有存在指定内容的源文件。
匹配多个样式:通常只指定一个样式,但是也可以使用-e选项指定多个样式,另外可以使用-i选项忽略字符的大小写。

user@ubuntu:~$ grep -e "pattern1" -e "pattern2"

还可以将所有需要匹配的模式写入一个文件,每行一个模式,然后使用-f选项执行grep就可以指定非常多个模式了。
静默输出:就是不需要输出匹配的行或者内容,只需要返回是否存在的一个布尔值,此时使用-q选项就可以不输出任何内容,然后使用$?变量访问上一个命令的返回值是否为0,如果是0就表示匹配到了,否则就是没有匹配到。

if [ $# -ne 2 ];
then
echo "$0 match_text filename"
fi

match_text=$1
filename=$2

grep -q $match_text $filename
if [ $? -eq 0 ];
then
echo "The text exists in the file"
else
echo "The text does note exist in the file"
fi

匹配文本的前后行:如果找到了匹配的行,默认只输出这行内容,但是可以通过-A -B -C选项来执行输出匹配行的前后行,对调试程序比较有效。

user@ubuntu:~$ seq 10 | grep 5 -A 3
5
6
7
8
user@ubuntu:~$ seq 10 | grep 5 -B 3
2
3
4
5
user@ubuntu:~$ seq 10 | grep 5 -C 2
3
4
5
6
7

grep作为大师级的工具,提供的选项特别丰富,还需要进一步实践和联系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值