[TOC]

0x00 文件查看

cat 命令

描述:cat命令连接文件并打印到标准输出设备上(显示、读取或拼接文件内容),cat经常用来显示文件的内容,类似于下的type命令。
当文件较大的时候建议采用more或者less命令进行查看文件:

  • Ctrl+S:停止滚屏
  • Ctrl+Q:恢复滚屏
  • Ctrl+C:(中断)可以终止该命令执行,并返回shell提示符

语法参数:

-n/--number:显示文本行号从1开始
-b/--number-noblank:不对空白行编号
-s/--squeeze-blank:当遇到连续两行以上的空白行就代替为1行的空白行
-A:显示不可打印字符,行尾显示“$”;
-e:等价于"-vE"选项;
-t:等价于"-vT"选项;

实际案例:

#示例1.常见示例
cat -n time.sh
cat -b time.sh
cat m1 m2 (同时显示文件ml和m2的内容)
cat m1 m2 > file (将文件ml和m2合并后放入文件file中)

WeiyiGeek.cat案例


head 命令

描述:用于显示文件的开头的内容,在默认情况下,head命令显示文件的头10行内容。
如果指定了多于一个文件在每一段输出前会给出文件名作为文件头,如果不指定文件,或者文件为”-“,则从标准输入读取数据。

语法参数:

-数字 :显示行数
-n <数字> :指定文件头部要显示内容的行数;
-c <字符数> :指定显示头部内容的字符数;
-v :总是显示文件名的头信息;
-q : 不显示文件名信息;

操作示例:

#示例1.基础示例
head /etc/passwd #显示开头前10行
head -1 /etc/passwd #显示开头前 -k 行
head -2 run.js
# const { exec } = require('child_process')
# exec('hexo server -p 80 -d',(error, stdout, stderr) => {

#示例2. #除最后k行外,显示剩余全部内容
head -n -k /etc/passwd
head -n -3 10.txt #显示从1到倒数第3行(1~7)


# 示例3.1个字符占1个字节,注意回车换行各算一个字节
head -c 100 /etc/passwd #显示前100字节的字符
head -c -100 /etc/passwd #显示从0到倒数第100字节的字符

WeiyiGeek.heade示例


less 命令

描述:该命令的作用与more十分相似,都可以用来浏览文字档案的内容,不同的是less命令允许用户向前或向后浏览文件,而more命令只能向前浏览。

参数选项:

-b<缓冲区大小> 设置缓冲区的大小
-e 当文件显示结束后,自动离开
-f 强迫打开特殊文件,例如外围设备代号、目录和二进制文件
-g 只标志最后搜索的关键词
-i 忽略搜索时的大小写
-m 显示类似more命令的百分比
-N 显示每行的行号
-o<文件名> 将less 输出的内容在指定文件中保存起来
-Q 不使用警告音
-s 显示连续空行为一行
-S 行过长时间将超出部分舍弃
-x<数字> 将“tab”键显示为规定的数字空格

命令内部操作按键功能如下:

  • 用less命令显示文件时,用PageUp键向上翻页,用PageDown键向下翻页,要退出less程序,应按Q键
    #基础操作
    b 向后翻一页
    d 向后翻半页
    h 显示帮助界面
    Q 退出less 命令
    u 向前滚动半页
    y 向前滚动一行
    空格键 滚动一页
    回车键 滚动一行
    :n - 浏览下一个文件
    :p - 浏览前一个文件


    #文件搜索
    / : 使用一个模式进行搜索,并定位到下一个匹配的文本
    ? : 使用模式进行搜索,并定位到前一个匹配的文本
    n : 向前查找下一个匹配的文本
    N : 向后查找前一个匹配的文本

    #全屏导航
    ctrl + F :向前移动一屏
    ctrl + B :向后移动一屏
    ctrl + D :向前移动半屏
    ctrl + U :向后移动半屏
    j : 向前移动一行
    k : 向后移动一行
    G : 移动到最后一行
    g : 移动到第一行
    q / ZZ : 退出 less 命令
    #标记导航 当使用 less 查看大文件时,可以在任何一个位置作标记,可以通过命令导航到标有特定标记的文本位置。
    ma : 使用 a 标记文本的当前位置
    'a : 导航到标记 a 处'


    #编辑文件
    v : 进入编辑模式,使用配置的编辑器编辑当前文件 (Vim)

实际案例:

#示例1.浏览多个文件
less file1 file2
#当打开多个文件时,使用如下命令在多个文件之间切换
:n - 浏览下一个文件
:p - 浏览前一个文件


#方式二,正在浏览一个文件时,使用 :e 打开另一个文件。
less file1
:e file2


#示例3.显示行号并且在文件末尾自己关闭文件
less -N -e 1.txt

WeiyiGeek.less示例


tail 命令

描述:用于输入文件中的尾部内容,命令也可以指定开始点将文件标准输出,默认在屏幕上显示指定文件的末尾10行。
如果给定的文件不止一个,则在显示的每个文件前面加一个文件名标题,如果没有指定文件或者文件名为“-”,则读取标准输入。

语法参数:

tail(选项)(参数)

--retry:即是在tail命令启动时,文件不可访问或者文件稍后变得不可访问,都始终尝试打开文件。使用此选项时需要与选项“——follow=name”连用;
-c<N>或——bytes=<N>:输出文件尾部的N(N为整数)个字节内容;
-f<name/descriptor>或;--follow<nameldescript>:显示文件最新追加的内容。“name”表示以文件名的方式监视文件的变化。“-f”与“-fdescriptor”等效;(常用)
-F:与选项“-follow=name”和“--retry"连用时功能相同" ()
-n<N>或——line=<N>:输出文件的尾部N(N位数字)行内容。
--pid=<进程号>:与“-f”选项连用,当指定的进程号的进程终止后,自动退出tail命令;
-q或——quiet或——silent:当有多个文件参数时,不输出各个文件名;
-s<秒数>或——sleep-interal=<秒数>:与“-f”选项连用,指定监视文件变化时间隔的秒数; (常用)
-v或——verbose:当有多个文件参数时,总是输出各个文件名;

实际案例:

#示例1.简单监控查看更新文件
tail -f -s 3 /var/log/messages #每3秒更新
Jun 26 08:01:01 master systemd: Removed slice User Slice of root.
Jun 26 09:01:01 master systemd: Created slice User Slice of root.
Jun 26 09:01:01 master systemd: Started Session 25 of user root.

#示例2.
tail file (显示文件file的最后10行)
tail +20 file (显示文件file的内容,从第20行至文件末尾)
tail -c 10 file (显示文件file的最后10个字符)

注意事项

  • 如果表示字节或行数的N值之前有一个”+”号,则从文件开头的第N项开始显示,而不是显示文件的最后N项。
  • N值后面可以有后缀:b表示512,k表示1024,m表示1048576(1M)。


watch 命令

描述:监测一个命令的运行结果,省的你一遍遍的手动运行,在Linux下,watch是周期性的执行下个程序,并全屏显示执行的结果;

  • 命令功能:可以将命令的输出结果输出到标准输出设备,多用于周期性执行命令/定时执行命令
  • 比如 tail 一个 log 文件,ls 监测某个文件的大小变化

语法参数:

#命令格式:
    watch[ 参数 ][命令]
#命令参数:
-n或--interval watch 缺省每2秒运行一下程序,多用于周期性执行命令/定时执行命令。
-d或-differences watch 会高亮显示变化的区域,而-d = cumulative 选项会把变动过的地方(不管最近的那次有没有变动)都会高亮显示出来。
-t或-no-title 会关闭watch 命令在顶部的时间间隔命令,

实际案例:

watch -n 2 tail -20 /var/log/messages 每隔两秒钟跳一下最后20行的内容查看事实的信息

#实例1:每隔一秒高亮显示网络链接数的变化情况 (重要)
命令 watch -n 1 -d netstat -ant

#实例2:每隔一秒高亮显示命令链接数的变化情况
命令 watch -n 1 -d ' pstree | grep http ' #每隔一秒高亮显示http 链接数的变化情况,后面接的命令若带有管道符,需要加“将命令区域归整”。

#实例3:实时查看模拟攻击客户机建立起来的链接数
命令 watch 'netstat -an | grep:21 | \grep<模拟攻击客户机的IP> wc -1'


#实例4:检测当前目录中 scf ' 的文件的变化
命令:watch -d 'ls -l | grep scf'

#实例5:10秒一次输出系统的平均负载
命令:watch -n 10 ' cat /proc/loadavg'

WeiyiGeek.watch示例


wc 命令

描述:用于统计文本中行数的单词数以及字节数;
参数:

wc【选项】【文件名】   #字符/行数/字节所统计
#选项:
-l 统计行数
-w 统计单词数
-c 统计字节数
-m 统计字符数(对于中文)
-L 统计字符串长度

实际操作:

#示例1.显示文件的内容信息
$wc run.js
9 26 251 run.js #'行数' '单词数' '字节数' install.log

#其他示例
wc -c test.txt #显示字节数中午也显示1个字节
wc -m test.txt #主要针对于中午字符(两个字节)

#示例3.验证文件字符长度
$ echo 1234567890 > www.txt
$ echo 1234567890 | wc -L # 长度为10 (重点)
$ cat www.txt | wc -L #长度为10

WeiyiGeek.wc示例


stat 命令

描述:显示文件或文件系统的状态,显示出文件的大小以及块大写所属权限用户组和创修访问时间。

语法和参数:

stat [选项]... 文件
#必选参数对长短选项同时适用。
-L, --dereference 跟随链接
-f, --file-system 显示文件系统状态而非文件状态
-c --format=FORMAT use the specified FORMAT instead of the default;output a newline after each use of FORMAT
--printf=FORMAT Like --format, but interpret backslash escapes,and do not output a mandatory trailing newline; if you want a newline, include \n in FORMAT
-t, --terse print the information in terse form

实际案例:

#实例1.常规形式打印
stat weiyigeek
文件:cqzk
# 大小:15 块:8 IO 块:4096 普通文件
# 设备:fe00h/65024d Inode:2105407 硬链接:1
# 权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
# 最近访问:2026-07-22 01:29:48.574588495 +0800
# 最近更改:2026-07-22 01:29:45.246588379 +0800
# 最近改动:2026-07-22 01:29:45.246588379 +0800

#实例2.用简洁的形式打印信息
stat -t cqzk
# cqzk 15 8 81a4 0 0 fe00 2105407 1 0 0 1784654988 1784654985 1784654985 0 4096


jq 命令

描述:jq它能轻松地把你拥有的数据转换成你期望的格式,而且需要写的程序通常也比你期望的更加简短。它可以对json数据进行分片、过滤、映射和转换,和sed、awk、grep等命令一样,都可以让你轻松地把玩文本。

基础语法:

Usage: jq [options] <jq filter> [file...]
-c 单行输出json字符串;
-n 使用“null”作为单个输入值;
-e 设置输出时候的退出状态码;

注意事项:

  • jq命令不是系统自带的在linux系统中也可以直接用yum安装
  • jq命令是用C编写没有运行时依赖,所以几乎可以运行在任何系统上。预编译的二进制文件可以直接在Linux、OS X和windows系统上运行,当然在linux和OS X系统你需要赋与其可执行权限;

基础示例:例子文件在文件json.txt中保存如下内容

[{"name":"WeiyiGeek","url":"http://tool.chinaz.com","address":{"city":"xiameng","country":"China"},"arrayBrowser":[{"name":"Google","url":"http://www.google.com"},{"name":"Baidu","url":"http://www.baidu.com"}]},{"name":"WeiyiGeek","url":"http://tool.zzhome.com","address":{"city":"dalian","country":"China"},"arrayBrowser":[{"name":"360","url":"http://www.so.com"},{"name":"bing","url":"http://www.bing.com"}]}]


  1. 最简单的jq程序是表达式”.” 个人理解为根,它不改变输入,但可以将其优美地输出便于阅读和理解

    cat json.txt | jq '.' #可以采用管道符传递数据
    jq '.' json.txt
    #美化输出
    [
    {
    "name": "WeiyiGeek",
    "url": "http://tool.chinaz.com",
    "address": {
    "city": "xiameng",
    "country": "China"
    },
  2. 输出列表中的第一个元素,可以使用[index]:

    cat json.txt | jq '.[0]'
  3. jq支持管道线|,它如同linux命令中的管道线——把前面命令的输出当作是后面命令的输入

    cat json.txt | jq '.[0] | {name:.name,city:.address.city}'
    {
    "name": "WeiyiGeek",
    "city": "厦门"
    }

    #值得注意的地方 [] 索引值
    cat json.txt | jq '.[0] | {name:.arrayBrowser[1].name,city:.address.city}'
    {
    "name": "Baidu",
    "city": "厦门"
    }

    #注意下面的[]没有加上索引默认是全部满足条件的
    cat json.txt | jq ".[] | {name:.arrayBrowser[1].name,city:.address.city}"
    {
    "name": "Baidu",
    "city": "厦门"
    }
    {
    "name": "bing",
    "city": "大连"
    }
  4. 如果希望把jq的输出当作一个数组,可以在前后加上[]:

    cat json.txt | jq "[.[] | {name:.arrayBrowser[1].name,city:.address.city}]"
    [
    {
    "name": "Baidu",
    "city": "厦门"
    },
    {
    "name": "bing",
    "city": "大连"
    }
    ]


  1. 自定义key在{}中冒号前面的名字是映射的名称,你可以任意修改

    cat json.txt | jq "[.[] | {name_001:.arrayBrowser[1].name,city_002:.address.city}]"

    [
    {
    "name_001": "Baidu",
    "city_002": "厦门"
    },
    {
    "name_001": "bing",
    "city_002": "大连"
    }
    ]
  2. 内建函数jq还有一些内建函数如 key,has(用来是判断是否存在某个key)

    #比如key是用来获取JSON中的key元素的:
    $ jq 'keys' json.txt
    [
    0,
    1
    ]

    #比如has是用来是判断是否存在某个key,注意这里由于和shell中的{}冲突所以用()
    [[email protected] ~]# jq 'has(2)' json.txt
    false
    [[email protected] ~]# jq 'has(1)' json.txt
    true

0x01 文件比较与分割

diff 命令

描述:比较给定的两个文件不同之处,并以所在行的形式进行显示;
(File)是以逐行的方式,比较文本文件的异同处,比较两个文件的内容 (源文件 和 目标文件),如果使用“-”代替“文件”参数,则要比较的内容将来自标准输入。

diff 的选项由 -, 开始 所以正常地 源文件(名) 和 目标文件(名) 不可以用 - 开头. 然而, – 可以被它视为保留的即使作为文件名的开头

语法参数:

-<行数>:指定要显示多少行的文本。此参数必须与-c或-u参数一并使用;
-a或——text:diff预设只会逐行比较文本文件;
-b或--ignore-space-change:不检查空格字符的不同;
-B或--ignore-blank-lines:不检查空白行;
-c:显示全部内容,并标出不同之处;
-C<行数>或--context<行数>:与执行“-c-<行数>”指令相同;
-d或——minimal:使用不同的演算法,以小的单位来做比较;
-D<巨集名称>或ifdef<巨集名称>:此参数的输出格式可用于前置处理器巨集;
-e或——ed:此参数的输出格式可用于ed的script文件;
-f或-forward-ed:输出的格式类似ed的script文件,但按照原来文件的顺序来显示不同处;
-H或--speed-large-files:比较大文件时,可加快速度;
-l<字符或字符串>或--ignore-matching-lines<字符或字符串>:若两个文件在某几行有所不同,而之际航同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异;
-i或--ignore-case:不检查大小写的不同;
-l或——paginate:将结果交由pr程序来分页;
-n或——rcs:将比较结果以RCS的格式来显示;
-N或--new-file:在比较目录时,若文件A仅出现在某个目录中,预设会显示:Only in目录,文件A 若使用-N参数,则diff会将文件A 与一个空白的文件比较;
-p:若比较的文件为C语言的程序码文件时,显示差异所在的函数名称;
-P或--unidirectional-new-file:与-N类似,但只有当第二个目录包含了第一个目录所没有的文件时,才会将这个文件与空白的文件做比较;
-q或--brief:仅显示有无差异,不显示详细的信息;
-r或——recursive:比较子目录中的文件;
-s或--report-identical-files:若没有发现任何差异,仍然显示信息;
-S<文件>或--starting-file<文件>:在比较目录时,从指定的文件开始比较;
-t或--expand-tabs:在输出时,将tab字符展开;
-T或--initial-tab:在每行前面加上tab字符以便对齐;
-u,-U<列数>或--unified=<列数>:以合并的方式来显示文件内容的不同;
-v或——version:显示版本信息;
-w或--ignore-all-space:忽略全部的空格字符;
-W<宽度>或--width<宽度>:在使用-y参数时,指定栏宽;
-x<文件名或目录>或--exclude<文件名或目录>:不比较选项中所指定的文件或目录;
-X<文件>或--exclude-from<文件>;您可以将文件或目录类型存成文本文件,然后在=<文件>中指定此文本文件;
-y或--side-by-side:以并列的方式显示文件的异同之处;
--left-column:在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容;
--suppress-common-lines:在使用-y参数时,仅显示不同之处。

其中字母”a”、”d”、”c”分别表示添加、删除及修改操作。
其中以<开始的行属于文件1,以>开始的行属于文件2。

实际案例:

#示例1.将目录/usr/li下的文件"test.txt"与当前目录下的文件"test.txt"进行比较
diff /usr/li test.txt #使用diff指令对文件进行比较
n1 a n3,n4
n1,n2 d n3
n1,n2 c n3,n4
#而"n1"、"n2"表示在文件1中的行号,"n3"、"n4"表示在文件2中的行号,后面会以>显示具体的文件
diff 1.txt 2.txt
1.txt 1,2,3,4,5 #5a6,7 #代表从6行存在添加数据
2.txt 1,2,3,4,5,5,6 #6,7d5 #相比较文件2无6到七的字符


#示例2.比较两个文件夹不同和和递归比较
diff -r myweb/ html

WeiyiGeek.示例2

#示例3.将补定文件进行输入到新文件夹中
#从效果来看事是将两个文件的不同之处都输出 -3,5 代表 删除两个字符, +3,5代表添加两个字符
diff -ruN test1.rb,test1.rb
diff -ruN test.rb test1.rb > test.diff #产生补定文件

注意事项

  • diff - - 比较一份标准输入的它自己的拷贝,如果 源文件 是一个目录和 目标文件 不是(目录), diff 会比较在 源文件(目录) 里的文件的中和目标文件同名的(文件) , 反过来也一样非目录文件不能是 - .
  • 如果该命令指定进行目录的比较,则将会比较该目录中具有相同文件名的文件, 依照字母次序排序;而不会对其子目录文件进行任何比较操作,这个比较是不会递归的,除非给出 -r 或者 –recursive.
  • diff 不把一个目录的内容看为它是一个文件来比较。被指定的文件不能是标准的输入, 因为标准的输入是无名的并且"有一样的名字的文件"的观点不适用。


comm 命令

描述:可以用于两个文件之间的比较( 逐行比较两个已排序的文件),它有一些选项可以用来调整输出,以便执行交集、求差、以及差集操作。

  • 交集:打印出两个文件所共有的行。
  • 求差:打印出指定文件所包含的且不相同的行。
  • 差集:打印出包含在一个文件中,但不包含在其他指定文件中的行。

基础语法:

comm(选项)(参数)

#选项
-1:不显示在第一个文件出现的内容;
-2:不显示在第二个文件中出现的内容;
-3:不显示同时在两个文件中都出现的内容。
--check-order check that the input is correctly sorted, even if all input lines are pairable
--nocheck-order do not check that the input is correctly sorted
--output-delimiter=STR separate columns with STR

实际案例:

#示例1.
#输出的第一列只包含在aaa.txt中出现的行,第二列包含在bbb.txt中出现的行,第三列包含在aaa.txt和bbb.txt中相同的行。各列是以制表符(\t)作为定界符。
$ comm aaa.txt bbb.txt
aaa
bbb
ccc
aaa
ddd
eee
111
222
hhh
ttt
jjj
第一列 第二列 第三列


#示例1. 交集 打印两个文件的交集,需要删除第一列和第二列:
comm aaa.txt bbb.txt -1 -2 #即自显示第三列
# bbb
# ccc


#示例2. 求差 打印出两个文件中不相同的行,需要删除第三列:
comm aaa.txt bbb.txt -3 | sed 's/^\t//' # 连续的bbb,ccc可以匹配, 是将制表符(\t)删除,以便把两列合并成一列。
comm -3 t1.txt t2.txt --nocheck-order | tr -d '\t'
aaa
aaa
ddd
eee
111
222
hhh
ttt
jjj
comm -3 t1.txt t2.txt --nocheck-order | tr -d '\t' | uniq -u #删除重复的行


#示例3.差集通过删除不需要的列,可以得到aaa.txt和bbb.txt的差集:
$comm aaa.txt bbb.txt -1 -3 #aaa.txt的差集
$comm aaa.txt bbb.txt -2 -3 #bbb.txt的差集
aaa
ddd
eee
111
222


split 命令

split命令可以将一个大文件分割成很多个小文件,有时需要将文件分割成更小的片段,比如为提高可读性,生成日志等

语法参数:

-d 使用数字而不是字母作为切割后的小文件的后缀;
-a <number>,后缀的length
-v 显示详细的处理信息
-b <字节> 每个分割文件的大小
-C <数字> 指定输出到每一个文件的每一行的大小,数字后缀可以是
b: 512(blocks) #非常注意
K: 1024(kibiBytes)
KB: 1000(kiloBytes)
M: 1024*1024(mebiBytes)
MB: 1000*1000(megaBytes)
G: 1024*1024*1024(gibiBytes)
GB: 1000*1000*1000(gibaBytes) #T, P, E, Z, Y
-l<行数> 指定切割的行数作为切割文件的单位;

实际案例:

#示例1.生成一个大小为100KB的测试文件:然后将其进行分割
dd if=/dev/zero bs=100k count=1 of=date.file
split -b 10k date.file #使用split命令将上面创建的date.file文件分割成大小为10KB的小文件:

WeiyiGeek.split分割

#示例2.文件被分割成多个带有字母的后缀文件,如果想用数字后缀可使用-d参数,同时可以使用-a length来指定后缀的长度:
split -b 10k date.file -d -a 3; ls
# date.file x000 x001 x002 x003 x004 x005 x006 x007 x008 x009
split -b 1b anaconda-ks.cfg -d -a 2 split #为分割后的文件指定文件名的前缀
# -rw-r--r--. 1 root root 512 Jun 26 06:33 split00
# -rw-r--r--. 1 root root 512 Jun 26 06:33 split01
# -rw-r--r--. 1 root root 261 Jun 26 06:33 split02


#示例4.还可以以分割流媒体
split -b 20m RevolutionOS.rmvb RevOS_part_ ; ls -lh
# 总计 552M
# -rwx------ 1 hoho hoho 276M 2005-09-09 RevolutionOS.rmvb
# -rw-r--r-- 1 root root 20M 03-19 17:59 RevOS_part_aa
# -rw-r--r-- 1 root root 20M 03-19 17:59 RevOS_part_ab


#示例3.# 使用-l选项根据文件的行数来分割文件,例如把文件分割成每个包含10行的小文件:
split -l 10 date.file
split -l 10 test.txt text_

WeiyiGeek.split示例


csplit 命令

描述:用于将一个大文件分割成小的碎片,并且将分割后的每个碎片保存成一个文件。碎片文件的命名类似“xx00”,“xx01”,同时每个分块文件的字节数也将被输出到标准输出。

csplit命令是split的一个变体,他们的不同点:

  • split只能够根据文件大小或行数来分割
  • csplit能够根据文件本身特点来分割文件。

语法参数:

csplit [选项]... 文件or格式  #如果文件为"-",则读取标准输入
csplit [-kqsz][-b<输出格式>][-f<输出字首字符串>][-n<输出文件名位数>][文件][范本样式...]

#长选项必须使用的参数对于短选项时也是必需使用的:
-b, --suffix-format=格式 使用sprintf 格式代替%02d.log,与-n连用形成后缀;
-f, --prefix=前缀 使用指定前缀代替"xx",“hello”,则输出的文件名称会变成hello00,hello、
-k, --keep-files 不移除错误的输出文件
-n, --digits=数位 使用指定的进制数位代替二进制,“3”,则输出的文件名称会变成xx000,xx001等
-z, --elide-empty-files 删除空的输出文件

#格式"可以是,一个行的偏移量需要在正整数值之后声明"+" 或 "-"
整数 不包括指定的行,并以其为文件分块边界
/表达式/[偏移量] 不包括匹配到的行,并以其为文件分块边界
%表达式%[偏移量] 预先跳过匹配的行数,以其为文件分块边界

-s, --quiet, --silent 不显示输出文件的尺寸计数
{整数} 将之前指定的模式重复指定的次数
{*} 将之前指定的模式重复尽可能多的次数。

实际案例:

#示例1。需要将server.log分割成server1.log、server2.log、server3.log,这些文件的内容分别取自原文件中不同的SERVER部分:
csplit server.log /SERVER/ -n2 -s {*} -f server -b "%02d.log"; rm server00.log ; ls #匹配SERVER边界每次以它作为分割界限
$csplit textfile /"Chapter X"/ #把文件以字符串"Chapter X"为分界符,分成两部分
#承上例, 但分割文件时以"Chapter X"字符串往下4行才是分割点
$csplit textfile /"Chapter X"/+4server01.log server02.log server03.log server.log

WeiyiGeek.内容分割

#示例3.按行分割
csplit test.txt -z -f server -b "%02d.log" 6 {1} # 6 line 需要除去 \n一行,分成3份 (自动匹配分割可能会出错)
# 93
# 102
# 87

# 把文件 FILE 分解,分解后大小为 15000 行,文件名前缀为 prefix 后缀为 00、01、02 ......99,而文件个数不多于100个。
csplit -k -f prefix FILE 15000 {99}

注意事项:

  • 您可以使用星号通配符来告诉 csplit 尽可能多地重复分割。这听起来很酷,但是如果文件不能等分,则可能会失败

0x02 内容分割与排序

cut 命令

描述:用来显示行中的指定部分,删除文件中指定字段,在文件的每一行中提取片断,在 每个文件 FILE 的 各行 中, 把 提取的片断显示在标准输出.

cut命令有两项功能:

  • 一是用来显示文件的内容,它依次读取由参数file所指 明的文件,将它们的内容输出到标准输出上;
  • 二是连接两个或多个文件,如cut fl f2 > f3将把文件fl和几的内容合并起来;

参数语法:

-b, --bytes=LIST:仅显示行中指定直接范围的内容;
-c, --characters=LIST:仅显示行中指定范围的字符;
-d, --delimiter=DELIM:指定字段的分隔符,默认的字段分隔符为“TAB”;
-f, --fields=LIST:显示指定字段的内容;
-n:与“-b”选项连用,不分割多字节字符;
--complement:补足被选择的字节、字符或字段;(取反显示)
--output-delimiter=<字段分隔符>:指定输出内容是的字段分割符;

#使用且只使用 -b, -c 或 -f 中的一个选项. LIST 由 一个 范围 (range) 或 逗号 隔开的多个范围组成. 范围是下列形式 之一:
N : 第 N 个 字节, 字符 或 字段, 从 1 计数 起
N- : 从 第 N 个 字节, 字符 或 字段 直至 行尾
N-M:从 第 N 到 第 M (并包括 第M) 个 字节, 字符 或 字段
-M : 从 第 1 到 第 M (并包括 第M) 个 字节, 字符 或 字段

#如果 没有 指定 文件 FILE, 或 FILE 是 -, 就从 标准输入 读取 数据.

实际操作:

cat test.txt 
No Name Mark Percent
01 tom 69 91
02 jack 71 87
03 alex 68 98

#示例1:采用默认的<tab>分割然后使用-f来提取指定字段
cut -f 1 test.txt
# No
# 01
# 02
# 以:分割文件,输出第一,二,三个字段(指定分隔符)
cat /etc/passwd | cut -f 1,2,3 -d ":" | head -5

#示例2.输出passwd中得第一个字符
cat /etc/passwd | cut -b 1
cat /etc/passwd | cut -b 1-4 | head -5 #输出文件的前四个字符

WeiyiGeek.cut示例1融合

#示例3.以特殊符号进行分割时 $'\n' (换行), $'\t'(Tab建),按照反斜杠控制的字符转换进行转换(printf 输出格式):
cat test | cut -f1,3 -d $'\t' # 以tab作为分割符号
cat test | cut -f1,3 -d $'\n' # 以换行符作为分割符号


#示例4.打印0字段到3字段得数据和排除
cut -d $'\t' -f -3 test.txt
#--complement 选项提取指定字段之外的列(打印除了第二列之外的列):
cut -f2 --complement test.txt
# No Mark Percent
# 01 69 91
# 02 71 87
# 03 68 98


#示例5.将所有行的2-3字符打印出来
cut -c 2,3 test.txt
cut -c 1-4 test.txt #两种形式都可以
echo $RANDOM | md5sum | cut -c 1-8 #值得学习
60354ab3


#示例6.采用制定输出符输出分割的字符
$ cut -d " " -f 1,3 --output-delimiter='-' init.sh
#!/bin/sh
npm-set
npm-set
npm--g
npm---save
hexo

WeiyiGeek.cut示例

注意事项:

  • 在使用-d指定特殊分割字符的时候需要采用''单引号否则会报错;


sort 命令

描述:在Linux里非常有用,它将文件进行排序,并将排序结果标准输出,sort命令既可以从特定的文件,也可以从stdin中获取输入。

参数语法:

用法:sort [选项]... [文件]...  或: sort [选项]... --files0-from=F
#串联排序所有指定文件并将结果写到标准输出,如果不指定文件,或者文件为"-",则从标准输入读取数据。


#排序选项:
-b, --ignore-leading-blanks 忽略前导的空白区域
-d, --dictionary-order 只考虑空白区域和字母字符
-f, --ignore-case 忽略字母大小写
-g, --general-numeric-sort 按照常规数值排序
-i, --ignore-nonprinting 只排序可打印字符
-M, --month-sort 比较 (未知) < "一月" < ... < "十二月" 在LC_ALL=C 时为(unknown) < 'JAN' < ... < '`DEC'
-h, --human-numeric-sort 使用易读性数字(例如: 2K 1G-即文件大小排序)
-n, --numeric-sort 根据字符串数值比较(数字排序,默认是升序)
-R, --random-sort 根据随机hash 排序
--random-source=文件 从指定文件中获得随机字节
-r, --reverse 逆序输出排序结果
--sort=WORD 按照WORD 指定的格式排序:一般数字-g,高可读性-h,月份-M,数字-n,随机-R,版本 "general-numeric" - "human-numeric" - "month" - "numeric" - "random" - "version"
-V, --version-sort 在文本内进行自然版本排序

#其他选项:
--batch-size=NMERGE 一次最多合并NMERGE 个输入;如果输入更多则使用临时文件
-c, --check, --check=diagnose-first 检查输入是否已排序,若已有序则不进行操作
-C, --check=quiet, --check=silent 类似-c,但不报告第一个无序行
--compress-program=程序 使用指定程序压缩临时文件;使用该程序的-d 参数解压缩文件
--debug 为用于排序的行添加注释,并将有可能有问题的用法输出到标准错误输出
--files0-from=文件 从指定文件读取以NUL 终止的名称,如果该文件被指定为"-"则从标准输入读文件名
-k, --key=位置1[,位置2] 在位置1 开始一个key,在位置2 终止(默认为行尾)参看POS语法
#补充-k选项的具体语法格式:
# FStart(字段).CStart(列) Modifie,FEnd.CEnd Modifier
# -------Start--------,-------End--------
# FStart.CStart 选项 , FEnd.CEnd 选项
# Start部分也由三部分组成于End部分以`,`分割,其中的Modifier部分就是我们之前说过的类似n和r的选项部分;,
# - 其中FStart就是表示使用的域,而CStart则表示在FStart域中从第几个字符开始算“排序首字符”。
# - 如果你省略.CEnd,则表示结尾到“域尾”,即本域的最后一个字符。或者如果你将CEnd设定为0(零),也是表示结尾到“域尾”。

-u, --unique # 配合-c,严格校验排序;不配合-c,则只输出一次排序结果(可以去重复)
-m, --merge 合并已排序的文件,不再进行排序
-o, --output=文件 #将结果写入到文件而非标准输出
-s, --stable 禁用last-resort 比较以稳定比较算法
-S, --buffer-size=大小 指定主内存缓存大小
-t, --field-separator=分隔符 #使用指定的分隔符代替非空格到空格的转换 类似于awk的-F,cut的-d选项;
-T, --temporary-directory=目录 使用指定目录而非$TMPDIR 或/tmp 作为临时目录,可用多个选项指定多个目录
--parallel=N 将同时运行的排序数改变为N
-z, --zero-terminated 以0 字节而非新行作为行尾标志

#指定的大小可以使用以下单位之一:
内存使用率% 1%,b 1、K 1024 (默认),M、G、T、P、E、Z、Y 等依此类推

实际案例:

#示例0.会按照先字母后数字进行排序 (Default)即依次按ASCII码值进行比较,最后将他们按升序输出。
sort -n 1.txt #默认以第一个数据来排序,而且默认是以字符串形式来排序,所以由字母 a 开始升序排序 (可以不加上-k 1,1)
# admin
# blog
# pass
# 123


#示例1.直接去重复进行排序
echo -e " 10.0.0.1 \n 10.0.0.2 \n 10.0.0.2 \n 10.0.0.1 \n 10.0.0.1 \n 10.0.0.3 " | sort -u
# 10.0.0.1
# 10.0.0.2
# 10.0.0.3


#示例1.指定分隔符与位置去掉重复值
sort -t ":" -k 1,1 /etc/passwd #内容是以 : 来分隔的,以第一栏第一个单词排序来排序(默认按照字母排序)
cat /etc/passwd | sort -t':' -k 7 -u
cat /etc/passwd | sort -t ':' -k 3n #用数字排序,默认是以字符串来排序的
cat /etc/passwd | sort -t ':' -k 3nr #倒序排列,默认是升序排序

WeiyiGeek.sort示例1

#示例2.-k选项基础使用于进阶
#从公司英文名称的第二个字母开始进行排序:
$ sort -t ' ' -k 1.2 facebook.txt #-k 1.2 表示对第一个域的第二个字符开始到本域的最后一个字符为止的字符串进行排序
# baidu 100 5000 #baidu因为第二个字母是a而名列榜首。
# sohu 100 4500 #sohu和 google第二个字符都是o,但sohu的h在google的o前面,所以两者分别排在第二和第三。
# google 110 5000
# guge 50 3000 #guge只能屈居第四了。

#只针对公司英文名称的第二个字母进行排序,如果相同的按照员工工资进行降序排序:
$ sort -t ' ' -k 1.2,1.2 -nrk 3,3 facebook.txt #n 数字/ -r 反向 # -k 3,3 指定员工工资域
# baidu 100 5000 #使用了-k 1.2,1.2的表示方式,表示我们“只”对第二个字母进行排序
# google 110 5000
# sohu 100 4500
# guge 50 3000

#对/etc/passwd,先以第六个域的第2个字符到第4个字符进行正向排序,再基于第一个域进行反向排序
cat /etc/passwd | sort -t':' -k 6.2,6.4 -k 1r


#示例3.个人理解、
sort -t "," -rk 1.2,1,5 -u file.txt #对文件中内容以,号分割然后再第一个域的第二个字母开始到第五个字母机进行逆向排序(降序),然后去掉重复内容;


#示例4.IP与MAC处理
sort -t '.' -k 3.1,3.1nr -k4.1,4.3nr arp.txt
172.25.27.33 16-15-16-EE-76-BD
192.168.137.26 16-15-16-EE-76-BD
192.168.137.1 16-15-16-EE-76-BD
255.255.255.240 16-15-16-EE-76-BD

WeiyiGeek.sort示例2


uniq 命令

描述:用于报告或忽略文件中的重复行,一般与sort命令结合使用

语法参数:

uniq(选项)(参数)
输入文件:指定要去除的重复行文件。如果不指定此项,则从标准读取数据;
输出文件:指定要去除重复行后的内容要写入的输出文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)。

#[选项]
-c或——count:在每列旁边显示该行重复出现的次数;
-d或--repeated:仅显示重复出现的行列;
-f n或--skip-fields=n:忽略比较指定的栏位,前n个字段与每个字段前的空白一起被忽略;
-s<字符位置>或--skip-chars=<字符位置>:忽略比较指定的字符;
-u或——unique:仅显示出一次的行列;
-w<字符位置>或--check-chars=<字符位置>:指定要比较的字符。

实际案例:

#示例0。不加参数只对相邻的行相同的内容去重
uniq file.txt
echo -e "10.0.0.1 \n 10.0.0.2 \n 10.0.0.2 \n 10.0.0.1 \n 10.0.0.1 \n 10.0.0.3 " | uniq
# 10.0.0.1
# 10.0.0.2
# 10.0.0.1 (还是有重复)
# 10.0.0.3
uniq file.txt


#示例1.原本使用sort输出的内容中有很多重复(实际将重复的放在一起),可在后面加上|uniq完全去重
sort file.txt | uniq
echo -e " 10.0.0.1 \n 10.0.0.2 \n 10.0.0.2 \n 10.0.0.1 \n 10.0.0.1 \n 10.0.0.3 " | sort | uniq
# 10.0.0.1
# 10.0.0.2
# 10.0.0.3


#示例2.按照顺序排列并且显示不重复
sort -u file #作用相同去重复
sort file | uniq -u
uniq -u file #不显示重复的数据("只显示出现一次的数据,有重复过的数据则不显示")


#示例3.统计各行在文件中出现的次数
sort file.txt | uniq -c
echo -e " 10.0.0.1 \n 10.0.0.2 \n 10.0.0.2 \n 10.0.0.1 \n 10.0.0.1 \n 10.0.0.3 " | sort | uniq -c
# 3 10.0.0.1
# 2 10.0.0.2
# 1 10.0.0.3


#示例4.文件中找出重复行
sort file.txt | uniq -d

WeiyiGeek.基础示例


fold 命令

描述:用于限制文件列宽,fold指令会从指定的文件里读取内容,将超过限定列宽的列加入增列字符后,输出到标准输出设备。若不指定任何文件名称,或是所给予的文件名为”-“,则fold指令会从标准输入设备读取数据。

#语法
fold [-bs][-w<每列行数>][--help][--version][文件...]

#参数:
-b或--bytes 以Byte为单位计算列宽,而非采用行数编号为单位。
-c或--characters 以字符为单位,指定宽度
-s或--spaces 以空格字符作为换列点。
-w<每列行数>或--width<每列行数> 设置每列的最大行数。

实际案例:

#示例1.将一个0~9的数字文件进行行折叠宽度成为2
fold -w 2 test.log
# 0123456789
# 01
# 23
# 45
# 67
# 89


#示例2.密码字符长度截取
cat /dev/urandom | tr -dc '[email protected]#$%&*.-+' | fold -w 12 | head -1
# yduDZvYNLY42
# .g0VvfzPooh*