Linux cat、echo、seq、sort、cut、tr、diff、uniq

发布时间 2023-10-08 14:57:12作者: 背对背依靠

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行的内容才行。