Linux cat、echo、seq、sort、cut、tr、diff、uniq
cat和echo
特点:
-
cat:从文件或标准输入读取内容并显示到标准输出(通常是屏幕)。提供一个或多个文件名作为参数时,cat 会连续显示这些文件的内容。
-
echo:输出参数内容到标准输出,提供给 echo 的任何内容(无论是文本、变量还是混合内容)都会被当作参数,然后 echo 将这些参数显示出来。
cat和echo区别:
-
cat 是为了读取和显示文件或标准输入的内容。
-
echo 是为了显示它的参数内容。
例如:输出time_stamp.log这个日志文件中的内容到屏幕上
cat time_stamp.log
例如:没有提供文件名称,会从标准输入读取内容
$ cat
# 直到接收到 EOF(例如按下 Ctrl + D)就会结束
例如:
# 会将 Hello, World! 作为echo的参数输出到屏幕
echo "Hello, World!"
sort和seq
特点:
- sort:可以接收标准输入,并对其内容按行进行排序。还可以直接接受文件名作为参数,并对文件中的内容进行排序。
- seq:按照指定的开始值、结束值和增量来产生一系列的数字
区别:
-
sort 是一个排序工具,它接收文本输入并输出排序后的文本
-
seq 是一个数字生成工具,它根据给定的参数输出一个数字序列
seq的使用:
seq一般在shell脚本中,结合循环来进行使用。
例如:产生1到10的连续数字
seq 1 10
例如:产生1到10之间,增量式2的数字
seq 1 2 10
sort的使用
sort直接接收标准输入进行排序
# 完成输入所有行后,按 Ctrl + D(在大多数 UNIX/Linux 系统上)发送一个 EOF(End Of File)信号,告诉 sort 你已完成输入。
sort读取文件内容进行排序
sort的默认排序规则:
sort的默认排序规则是根据当前的区域设置(locale)来设置的,所以不同的系统配置和不同的环境,默认规则可能不同。
可以简单地理解为sort默认按照ASCII码的大小进行升序(先小后大)排序。
sort会先比较改行的第一个字符,如果每行的第一个字符不相同,就按照ASCII值较小的字符对应的那一行就会被排在前面,这时后续的字符不再进行比较。
只有当正在比较的字符相同时,sort 才会移动到下一个字符进行比较。所以sort是通过逐个字符比较来排出顺序的
sort降序排序
sort默认是从小到达升序排序的,可以加 -r 参数实现降序排序,也就是从大到小排序
sort按照数值排序
使用sort的 -n 参数时,会认为每行的起始部分是一个数值,并基于这个数值来进行排序。如果行的起始部分不是一个数值或是空行,sort 会将其视为 0。这就是为什么空行或者首字符不是数字行会排在前面。
例如:
此时仅会比较每行开始的数字部分,所以只会关注并比较最前面的 1 和 2。后面的就都不管了
sort按照指定部分排序:
通过-t 参数来指定分隔符,将一行分为多列,然后使用-k 参数来指定按照哪一列进行排序,可以也指定多列。
例如:
sort -n -t ',' -k 2 n.txt
cut和tr命令
特点:
-
cut:将一行内容根据特定的分隔符分为多列,然后按“列”提取文本内容
-
tr:是用于字符转换和文本替换。从标准输入读取内容,并将结果写入标准输出
cut的使用
使用cut命令的时候,一般使用 -d 参数来指定分隔符,然后再使用 -f 参数来指定取哪些列。
例如:
cut -d : -f 1 /etc/passwd
tr的使用
tr命令不仅可以用来替换指定字符,还可以实现多个重复字符的压缩,指定字符的删除等功能。
tr替换指定字符:
不加任何参数,tr默认就是实现字符替换功能。
例如:
默认会从标准输入读取数据进行替换,并输出到屏幕上
可以你用Linux提供的匿名管道符实现对文件内容的替换
cat 1.txt | tr '123' 'abc'
tr删除指定字符
通过tr的 -d 参数 就可以删除标准输入中指定的字符
例如:删除 a-z 的字符
cat 1.txt | tr -d 'a-z'
说明:tr命令不支持文件名的通配符,但是tr支持字符类和字符范围
-
字符范围:使用 - 符号表示一个字符范围,例如 a-z 表示从 a 到 z 的所有小写字母
-
字符类:例如 [:space:]:空白字符
tr实现多个字符压缩
通过tr的 -s 参数,可以将多个相同的字符压缩为一个,然后输出
例如:
df -h /dev/sda | tr -s ' '
uniq和diff
特点:
- uniq:用于从输入中删除或报告重复的行
- diff:用于比较文件的内容之间的差异
uniq的使用
不加任何参数,默认就是将标准输入中的数据去除掉重复的行,然后输出到频幕上。
如果想统计每行出现的次数,可以通过 -c 参数实现
如果只是想把重复的行输出,通过 -d 参数即可
说明:uniq 命令默认行为是检测相邻的重复行。如果两个重复行不是相邻的,uniq 不会视其为重复。所以需要与 sort 命令结合使用来先对内容排序,这样所有的重复行都会变为相邻行,然后再使用 uniq 来去除或检测这些重复行。
例如:查找两个文件中相同的行
cat 1.txt 2.txt | sort | uniq -d
如果是像输出没有重复的行,通过 -u 参数即可
diff的使用
不加任何参数,即用来比较两个文件中内容的不同
2c2意思就是第一个文件的第二行和第二个文件的第二行不同,要让他们一样就需要改第一个文件的第二行内容。
< banana:这表示在比较中,第一个文件的第2行是"banana"。
---:分隔符,用于分隔两个文件中的差异。
> blueberry:这表示在比较中,第二个文件的第2行是"blueberry"。
# 这一串输出的意思是:为了使第一个文件与第二个文件相同,你需要将第一个文件中的 'banana' 更改为 'blueberry'”
-
c:change,表示需要更改一行来匹配另一行。
-
a:add,表示需要添加一行来匹配另一个文件。
-
d:delete,表示需要删除一行来匹配另一个文件。
例如:
表示第一个文件的5、6、7行和第二个文件不同,下面描述的就是具体的不同信息。
< 后面的是第一个文件的内容
----- 分隔符
< 后面的是第二个文件的内容
例如:
表示为了使第一个文件与第二个文件匹配,需要从第一个文件中删除第45行到第58行的内容(因为这些内容在第二个文件中不存在,至少在第29行周围不存在)。
例如:
表示要使第一个文件与第二个文件匹配,你需要将第一个文件的第61行(一个空行)更改为第二个文件的第32行到第36行的内容
例如:
表示要使得匹配,需要在第一个文件的61行后加上第二个文件的89到109行的内容才行。
如果只是检查两个文件是不是一样的,不关心哪些内容不一样,直接使用dff的 -q 参数就行了
例如:
diff -q CheckEncryption.log time_stamp.log