sort命令文本排序工具
sort只影响输出结果,不影响源文件
sort以行为单位,以每行的ascii码值得大小进行升序排序。
格式:sort 待排序文件:将文件内的文本内容进行排序,a到z的这种 。
-r:倒序排序文本内容
-t:该选项一般是和-k选项进行联合使用,-t是选择分隔符,-k是提取第几列,我们可以先用-t将文本内容分割,然后再用-k选项提取被分割的其中一列,然后将被提取的那一列作为排序的材料。
-k:提取指定列,与-t搭配使用,若我们指定分隔符,那么可以视为按文本内容的列进行分割。
-n:表示以数值的大小进行排序,但是排序内容必须是数值才行。
-u:可以去除给出的文本中重复的内容,比如有两行root,那么使用-u选项之后,就只会显示一个root。
-f:忽略待排序内容的大小写
例子:sort -t: -k3 /etc/passwd
该例子表示先将/etc/passwd中的文本内容用“:”进行分割,同时取出其第三列作为排序的主要对象。但是不会对文本内容进行提取,而是在原本的内容基础上将要排序的列进行排序。
PS!!!:sort命令默认是以空格作为分隔符的,像ps aux命令的输出的各个列都是以空格作为分隔符号的,所以此时我们可以不用指定分隔符号直接选择要排序的列即可,比如:
ps aux |sort -rnk4 :这条命令的意思就是从ps aux输出的第四列取出来然后作为排序的素材
uniq文本去重
uniq -c:去除连续重复的内容,并显示重复的次数,比如一个文本是这样的:
aa
aa
bb
aa
那么该uniq -c语句的执行结果是:3 aa 1 bb 1 aa,它只会将连续重复的规划在一起,如果要去除全部重复的并统计其内容应该输入:
uniq -cd :去除文本中全部的重复内容并输出重复的条数
tr命令字符替换
格式:tr 原字符串 目的字符串:tr将原字符串中的每个字符,按照目的字符串中的字符一一替换,建议原字符串与目的字符串的个数相同,否则可能会出现问题
-d:如果只写原字符串而没有写目的字符串,而且还加上了-d选项,那么就代表删除原字符串
例子1:cat "xiexie xiexie " | tr -d " " :该例子就代表删除文本内容中的空格
例子2:cat "xiexie xiexie" tr " " "\n":该例子代表将文本内容中的空格替换为换行符
同时还可以使用正则表达式如:
echo abcdefg|tr [a-z] [A-Z] :这个就将相关的输出的小写转换为大写
sed 命令
sed只会将处理后的文本内容输出,而不会去修改源文件中的内容
格式:sed “范围 操作” 文本内容
范围的表示形式:
如果不指定范围,那么默认使包括全部的文本内容
number:代表某一行,通过行号对指定内容进行选中
$:表示最后一行
/正则表达式/:通过正则表达式对内容进行过滤,同时若要使用拓展正则表达式,则必须使用-r选项
number1 ,number2:代表从第几行到第几行的内容
number1,+number2:表示从number1向下number2行的范围
number1;number2:代表指定number1行和number2行
number1~number2:表示从number1开始,每number2行就为目标对象
操作的表示形式
!:将!号放在操作的前面,表示做与操作相反的操作
d:表示将范围内的内容删除
例子:sed '10d' /etc/passwd
该例子表示将etc/passwd文件中的第十行的内容删除并输出,但是不会影响源文件。
p:表示输出匹配到的内容
我们在使用sed命令的时候比如做一些查询,修改或者添加的时候,如果不加p选项是将原本的内容执行了对应的操作之后的内容进行输出,如果加了p选项,那么还会输出该条sed命令操作到的地方,比如我们做了修改操作,那么只输出修改的地方,如果做了添加,那么只输出添加的内容。
a:表示在匹配到的行后追加内容
例子 sed '1,2a kk' /etc/passwd
该例子表示在passwd文件中的1到2行的后面都加上kk
i:表示在匹配到的行前追加内容(infront)
例子 sed '1,2i kk' /etc/passwd
该例子表示在passwd文件中的1到2行的前面都加上kk
c:表示将匹配到的内容进行替换(行替换)
例子 sed '1,2c kk' /etc/passwd
该例子表示在passwd文件中的1到2行全部替换为kk
w:表示将匹配到的内容进行另存
格式:sed '范围w 另存为文件' 源文本文件(外部存里面)
例子:sed -n '/^UUID/w /etc/fstab’ /mnt/temp.txt
该例子表示使用正则表达式对范围进行匹配,同时使用操作w将/mnt/temp.txt中关于UUID的内容,另存到/etc/fstab文件中。
r:表示从某个文件读取文本内容,然后放在匹配到的行后面
格式: sed '范围r 被读取源文件' 接收文本文件(内部放外面)
例子:sed '5r /etc/passwd' /tmp/kk.txt
该例表示将/etc/passwd中的文本内容放置在/tmp/kk.txt文件中第五行的后面并输出
同时在范围的指定时我们还可以使用正则表达式进行指定:
使用正则表达式必须用单括号或者双斜杆包围住,同时使用正则表达式的内容在两个斜杆里面如:
sed "/^uuid/ s/uuid//g"
上面这句话就表示所有以uuid开头的行中的uuid都切换成空
sed "/^uuid/ s/^uuid//g"
替换
s/old/new/g :将内容中的old全部都替换成new
s/old/new/ :将每行中的第一个old替换成new
如果想要指定某些行可以在替换的前面指定替换的范围,比如:
1,2 :这代表1到2行
sed -n '2p;7p' a.txt :只查看第二行和第七行
1,+2:代表从第一行以及往下2行
1~2 :代表从第一行开始每过一行行数增加2
n:静默输出,一般来说sed命令会将原本的内容执行对应的操作之后并输出在终端上,如果加了n选项,那么这个输出就不会进行显示。
选项
-r:使用拓展正则表达式
-i:操作直接影响源文件
-p:表示只输出匹配内容
awk命令
格式:awk '范围{print 想要的内容}'
awk可以自动地将每行地文本内容分割为多个字段,默认是使用空格或者tab制表符进行分隔,每个分隔地字段用$1,$2......$x进行表示。其中$0代表整行
用法一(截取文本中的列):awk '{print $1,$3}' log.txt(注意其默认的分隔符是空格或者tab键)
用法二(指定分隔符截取):awk -F, '{print $1,$2}' log.txt(注意该用法使用了-F选项指定了逗号作为分隔符,文本内部的每行数据由此使用逗号分隔)
同时-F后面还可以使用正则表达式指定想要的分隔符,如awk -F "[ #]+",这个就代表以空格或者#为分隔符,同时后面的加号代表着空格和井号将会被匹配多次,那么就意味着分隔符为任意个空格或者任意个井号。
用法三(变量设置):awk -v a=1 ‘{print $1,$1+a}’ log.txt(该例使用选项提前定义变量,并在输出中带入,该例就表示显示每行分隔的第一列的数据,以及第一列+1的数据)
echo 3.2 3.4|awk '{sum=$1+$2;print sum/2}':该例子在花括号的内部自定义了变量并进行了算术运算的使用。必须注意变量定义的语句与print的输出语句之间是使用分号“;”进行分隔。
awk变量的引用不需要使用美元符号。
$自带变量:NF(字段的数量),NR(每一行的行号)
用法四(直接带入字符串):awk '{print "the data is",$1 }' log.txt(该例子表示输出结果不仅仅可以调用文本内容中的被分隔的数据,同时还可以使用自己输入的字符串,但是必须注意字符串与分隔数据之间必须使用逗号隔开)
用法五(带有匹配模式):awk 'NR==3{print $1,$3}' 输出行号为3的那一行中的第一列和第三列的数据,其中NR是自带变量代表行号。
awk -F':' '$3>=500{print $0}' /etc/passwd :输出passwd中UID大于500的行
比较符号有<=,==,>=,!=
逻辑符号有&&(与),||(或)
用法六(替换输出的间隔符号):awk 'OFS="#"{print $1,$2}' log.txt:OFS表示自己定义$1和$2输出之间间隔的符号,默认$1和$2输出之间的间隔符号是空格,但是该例通过OFS自定义为井号#
用法七(利用awk进行浮点算法运算):echo 3.8 3.2 |awk { pirnt $1/$2 }:如果在shell中,是不支持浮点的运算,其计算结果会取整数,所以可以利用awk进行浮点的运算
echo 3.8 3.2 |awk {print $1+$2}:输出3.8+3.2,awk可以利用被分隔的数据进行算术运算
用法八(使用正则表达式匹配范围,然后再进行处理):
awk '/^uuid/{print $0}' /etc/passwd
这句话表示使用先使用正则匹配范围,然后再打印对应的行。注意使用正则匹配范围的时候同样要使用两个斜杆将正则表达式框住。
用法九(使用多个条件并进行多个输出)
awk 'NR==1{print $1}NR==2{print $2}'
如该句所示,使用NR进行两种情况下的两种输出
awk的BEGIN和END
BEGIN表示在处理文本之前要使用什么操作
END表示在处理文本之后要使用什么操作
awk 'BEGIN{print first }{print $1,$2.$3}END{print end}' log.txt:该例子表示在输出log.txt中的$1,2,3之前要先输出first,在输出$1,2,3之后要输出end
begin和end实现变量的累加
ps aux|grep ssh|grep -v grep |awk '{mem=mem+$4}END{print mem}':该例子表示输出sshd所有进程所占的内存百分比之和,因为awk是一行一行地对文本内容进行处理,所以
awk '{mem=mem+$4}这条语句就代表每读取一行的数据,就将第四列的数据,也就是内存占用百分比进行累加,mem就是最终累加的和。
awk对列内容的改变
awk '$1=100 {print $0}' /etc/passwd
该命令将$1的值修改为100后,然后再进行输出,如下图:
awk中引用变量
awk '{print $"'$aa'"}' etc/passwd
如上式中所示,如果要使用变量就需要使用双引号+单引号将变量括起来后才能使用,上式中的变量为aa,因为变量aa的值为1,所以$"'$aa'"==$1