Linux sort命令
Linux sort命令:对文件中的数据进行排序
Linux sort命令 语法
sort [选项] [文件]
命令中各选项的含义如表所示。
• -b 忽略每行前面开始出的空格字符。
• -c 检查文件是否已经按照顺序排序。
• -d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
• -f 排序时,将小写字母视为大写字母。
• -i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。
• -m 将几个排序好的文件进行合并。
• -M 将前面3个字母依照月份的缩写进行排序。
• -n 依照数值的大小排序。
• -u 意味着是唯一的(unique),输出的结果是去完重了的。
• -o 将排序后的结果存入指定的文件。
• -r 以相反的顺序来排序。
• -t 指定排序时所用的栏位分隔字符。
• +- 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
• --help 显示帮助。
• --version 显示版本信息。
• [-k field1[,field2]] 按指定的列进行排序
Linux sort命令 示例
正常的一个文件:
经过sort排序后的:
经过sort 逆排序后的:
使用sort命令对文件进行去重:
使用 -k 参数设置对第二列的值进行重排:
Linux uniq命令
Linux uniq命令 功能描述
使用uniq命令可以将文件内的重复行数据从输出文件中删除,只留下每条记录的惟一样本。命令语法:
uniq [选项] [文件]
参数:
• -c或--count 在每列旁边显示该行重复出现的次数。
• -d或--repeated 仅显示重复出现的行列。
• -f或--skip-fields= 忽略比较指定的栏位。
• -s或--skip-chars= 忽略比较指定的字符。
• -u或--unique 仅显示出一次的行列。
• -w或--check-chars= 指定要比较的字符。
• --help 显示帮助。
• --version 显示版本信息。
• [输入文件] 指定已排序好的文本文件。如果不指定此项,则从标准读取数据;
• [输出文件] 指定输出的文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)。
文件testfile中第 2、3、5、6、7、9行为相同的行,使用 uniq 命令删除重复的行,可使用以下命令:
uniq testfile
testfile中的原有内容为:
$ cat testfile #原有内容
test 30
test 30
test 30
Hello 95
Hello 95
Hello 95
Hello 95
Linux 85
Linux 85
使用uniq 命令删除重复的行后,有如下输出结果:
$ uniq testfile #删除重复行后的内容
test 30
Hello 95
Linux 85
检查文件并删除文件中重复出现的行,并在行首显示该行重复出现的次数。使用如下命令:
uniq -c testfile
结果输出如下:
$ uniq -c testfile #删除重复行后的内容
3 test 30 #前面的数字的意义为该行共出现了3次
4 Hello 95 #前面的数字的意义为该行共出现了4次
2 Linux 85 #前面的数字的意义为该行共出现了2次
当重复的行并不相邻时,uniq 命令是不起作用的,即若文件内容为以下时,uniq 命令不起作用:
$ cat testfile1 # 原有内容
test 30
Hello 95
Linux 85
test 30
Hello 95
Linux 85
test 30
Hello 95
Linux 85
这时我们就可以使用 sort:
$ sort testfile1 | uniq
Hello 95
Linux 85
test 30
统计各行在文件中出现的次数:
$ sort testfile1 | uniq -c
3 Hello 95
3 Linux 85
3 test 30
在文件中找出重复的行:
$ sort testfile1 | uniq -d
Hello 95
Linux 85
test 30
Linux cut命令
Linux cut命令:从文件每行中输出选定的字节、字符或字段
cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。
参数
• -b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
• -c :以字符为单位进行分割。
• -d :自定义分隔符,默认为制表符。
• -f :与-d一起使用,指定显示哪个区域。
• -n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的
范围之内,该字符将被写出;否则,该字符将被排除
在使用-b、-c和-f选项时,每种参数格式表示的范围如下。
N:从第1个开始数的第N个字节、字符或字段。
N-:从第N个开始到所在行结束的所有字符、字节或字段。
N-M:从第N个开始到第M个之间(包括第M个)的所有字符、字节或字段。
-M:从第1个开始到第M个之间(包括第M个)的所有字符、字节或字段。
实例
当你执行who命令时,会输出类似如下的内容:
$ who
rocrocket :0 2009-01-08 11:07
rocrocket pts/0 2009-01-08 11:23 (:0.0)
rocrocket pts/1 2009-01-08 14:15 (:0.0)
如果我们想提取每一行的第3个字节,就这样:
$ who|cut -b 3
c
c
显示文件/etc/passwd中的用户登录名和用户名全称字段,这是第1个和第5个字段,由冒号隔开:
Linux comm 命令
Linux comm 命令用于比较两个已排过序的文件。
这项指令会一列列地比较两个已排序文件的差异,并将其结果显示出来,如果没有指定任何参数,则会把结果分成 3 列显示:第 1 列仅是在第 1 个文件中出现过的列,第 2 列是仅在第 2 个文件中出现过的列,第 3 列则是在第 1 与第 2 个文件里都出现过的列。若给予的文件名称为 – ,则 comm 指令会从标准输入设备读取数据。
语法
comm [-123][--help][--version][第1个文件][第2个文件]
参数:
• -1 不显示只在第 1 个文件里出现过的列。
• -2 不显示只在第 2 个文件里出现过的列。
• -3 不显示只在第 1 和第 2 个文件里出现过的列。
• --help 在线帮助。
• --version 显示版本信息
实例
aaa.txt 与 bbb.txt 的文件内容如下:
[root@localhost text]# cat aaa.txt
aaa
bbb
ccc
ddd
eee
111
222
[root@localhost text]# cat bbb.txt
bbb
ccc
aaa
hhh
ttt
jjj
执行 comm 命令输出结果如下:
[root@localhost text]# comm aaa.txt bbb.txt
aaa
bbb
ccc
aaa
ddd
eee
111
222
hhh
ttt
jjj
第一列 第二列 第三列
输出的第一列只包含在 aaa.txt 中出现的列,第二列包含在 bbb.txt 中出现的列,第三列包含在 aaa.txt 和 bbb.txt 中都包含的列。各列是以制表符 t 作为定界符。
Linux diff 命令
Linux diff 命令用于比较文件的差异。
diff 以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则 diff 会比较目录中相同文件名的文件,但不会比较其中子目录。
语法
diff [-abBcdefHilnNpPqrstTuvwy][-][-C ][-D ][-I ][-S ][-W ][-x ][-X ][--help][--left-column][--suppress-common-line][文件或目录1][文件或目录2]
参数:
• - 指定要显示多少行的文本。此参数必须与-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 比较大文件时,可加快速度。
• -I或--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 以并列的方式显示文件的异同之处。
• --help 显示帮助。
• --left-column 在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容。
• --suppress-common-lines 在使用-y参数时,仅显示不同之处。
实例1:比较两个文件
[root@localhost test3]# diff log2014.log log2013.log
3c3
2013-03
8c8
2013-08
11,12d10
上面的”3c3″和”8c8″表示log2014.log和log20143log文件在3行和第8行内容有所不同;”11,12d10″表示第一个文件比第二个文件多了第11和12行。
实例2:并排格式输出
[root@localhost test3]# diff log2014.log log2013.log -y -W 50
2013-01 2013-01
2013-02 2013-02
2014-03 | 2013-03
2013-04 2013-04
2013-05 2013-05
2013-06 2013-06
2013-07 2013-07
2013-07 | 2013-08
2013-09 2013-09
2013-10 2013-10
2013-11 2013-11
> 2013-12
说明:
- “|”表示前后2个文件内容有不同
- ”
- “>”表示后面文件比前面文件多了1行内容
Linux join命令
Linux join命令用于将两个文件中,指定栏位内容相同的行连接起来。
找出两个文件中,指定栏位内容相同的行,并加以合并,再输出到标准输出设备。
语法
join [-i][-a][-e][-o][-t][-v][-1][-2][--help][--version][文件1][文件2]
参数:
• -a 除了显示原来的输出内容之外,还显示指令文件中没有相同栏位的行。
• -e 若[文件1]与[文件2]中找不到指定的栏位,则在输出中填入选项中的字符串。
• -i或--igore-case 比较栏位内容时,忽略大小写的差异。
• -o 按照指定的格式来显示结果。
• -t 使用栏位的分隔字符。
• -v 跟-a相同,但是只显示文件中没有相同栏位的行。
• -1 连接[文件1]指定的栏位。
• -2 连接[文件2]指定的栏位。
• --help 显示帮助。
• --version 显示版本信息。
实例
连接两个文件。
为了清楚地了解join命令,首先通过cat命令显示文件testfile_1和 testfile_2 的内容。
然后以默认的方式比较两个文件,将两个文件中指定字段的内容相同的行连接起来,在终端中输入命令:
join testfile_1 testfile_2
首先查看testfile_1、testfile_2 中的文件内容:
$ cat testfile_1 #testfile_1文件中的内容
Hello 95 #例如,本例中第一列为姓名,第二列为数额
Linux 85
test 30
cmd@hdd-desktop:~$ cat testfile_2 #testfile_2文件中的内容
Hello 2005 #例如,本例中第一列为姓名,第二列为年份
Linux 2009
test 2006
然后使用join命令,将两个文件连接,结果如下:
$ join testfile_1 testfile_2 #连接testfile_1、testfile_2中的内容
Hello 95 2005 #连接后显示的内容
Linux 85 2009
test 30 2006
文件1与文件2的位置对输出到标准输出的结果是有影响的。例如将命令中的两个文件互换,即输入如下命令:
join testfile_2 testfile_1
最终在标准输出的输出结果将发生变化,如下所示:
$ join testfile_2 testfile_1 #改变文件顺序连接两个文件
Hello 2005 95 #连接后显示的内容
Linux 2009 85
test 2006 30
Linux diff3命令
Linux diff3命令:按行比较3个文件
Linux diff3命令 语法
diff3 [选项] [文件1] [文件2] [文件3]
参数:
• -a:以文本模式进行比较和合并。
• -A style:设置合并冲突标记的样式。可用的样式有:equate(默认,将所有版本的内容都放在标记中)、diff2(类似于-E选项,会生成嵌入标记)和normal(只保留合并结果,不生成标记)。
• -E:生成嵌入标记,用于标识冲突的部分。
• -e:生成Ed脚本,其中包含将1、2和3文件合并为标准输出的操作,可与ed编辑器一起使用。
• -L label:为对应的文件指定标签,用于生成嵌入标记时显示冲突标记的标签。
• -m:输出合并后的结果,如果存在冲突,则在冲突区域使用>>>>>>标记。
• -L label1 -L label2 -L label3:为FILE1、FILE2和FILE3指定自定义标签。
• -o outfile:将合并后的结果输出到文件outfile,而不是标准输出。
• -x PAT:排除匹配正则表达式PAT的文件。
• -T file:从指定的文件file读取非交互式选项。
• --diff-program=prog:指定用于显示文件差异的程序。
• --help:显示帮助信息并退出。
• --version:显示版本信息并退出。
Linux diff3命令 示例
按行比较/root/a、/root/b和/root/c三个文件
Linux cmp命令
Linux cmp 命令用于比较两个文件是否有差异。
当相互比较的两个文件完全一样时,则该指令不会显示任何信息。若发现有所差异,预设会标示出第一个不同之处的字符和列数编号。若不指定任何文件名称或是所给予的文件名为”-“,则cmp指令会从标准输入设备读取数据。
语法
cmp [-clsv][-i ][--help][第一个文件][第二个文件]
参数:
• -c或--print-chars 除了标明差异处的十进制字码之外,一并显示该字符所对应字符。
• -i或--ignore-initial= 指定一个数目。
• -l或--verbose 标示出所有不一样的地方。
• -s或--quiet或--silent 不显示错误信息。
• -v或--version 显示版本信息。
• --help 在线帮助。
实例
要确定两个文件是否相同,请输入:
cmp prog.o.bak prog.o
这比较 prog.o.bak 和 prog.o。如果文件相同,则不显示消息。如果文件不同,则显示第一个不同的位置;例如:
prog.o.bak prog.o differ: char 4, line 1
如果显示消息 cmp: EOF on prog.o.bak,则 prog.o 的第一部分与 prog.o.bak 相同,但在 prog.o 中还有其他数据。
Linux colrm命令
Linux colrm命令用于滤掉指定的行。
colrm指令从标准输入设备读取书记,转而输出到标准输出设备。如果不加任何参数,则该指令不会过滤任何一行。
语法
colrm [开始行数编号]
参数说明:
• 开始行数编号: 指定要删除的列的起始编号。
• 结束行数编号: 指定要删除的列的结束编号,有时候这个参数可以省略。
实例
不带任何参数时该命令不会删除任何列:
colrm
按回车键后,光标将在第一行闪烁,等待标准输入,此时输入字符,如”Hello Linux!”,再按回车键后第二行将出现与第一行相同内容,此时按Ctrl+C组合键可以退出。终端中显示的内容如下所示:
cmd@hdd-desktop:~$ colrm
Hello Linux! #输入Hello Linux!字符串
Hello Linux! #输出刚才输入的字符串Hello Linux!
如想要删除第4 列之后的所有内容,可以使用如下命令:
colrm 4
类似于上例,此时标准输入等待输入,用户输入字符串按回车键后,将输出如下结果:
cmd@hdd-desktop:~$ colrm 4
Hello Linux! #输入Hello Linux!字符串
Hel #输出删除了第4列以后所有内容的字符串
删除指定列的内容。如删除第4列到第6列的内容,可使用如下命令:
colrm 4 6
输出的结果如下:
cmd@hdd-desktop:~$ colrm 4 6
Hello Linux! #输入Hello Linux!字符串
HelLinux! #输出删除了从第4列到第6列字符的字符串
Linux paste 命令
Linux 命令大全
Linux paste 命令用于合并文件的列。
paste 指令会把每个文件以列对列的方式,一列列地加以合并。
语法
paste [-s][-d ][--help][--version][文件...]
参数:
• -d或--delimiters= 用指定的间隔字符取代跳格字符。
• -s或--serial 串列进行而非平行处理。
• --help 在线帮助。
• --version 显示帮助信息。
• [文件…] 指定操作的文件路径
实例
使用paste指令将文件”file”、”testfile”、”testfile1″进行合并,输入如下命令:
paste file testfile testfile1 #合并指定文件的内容
但是,在执行以上命令之前,首先使用”cat”指令对3个文件内容进行查看,显示如下所示:
$ cat file #file文件的内容
xiongdan 200
lihaihui 233
lymlrl 231
$ cat testfile #testfile文件的内容
liangyuanm ss
$ cat testfile1 #testfile1文件的内容
huanggai 56
zhixi 73
当合并指令”$ paste file testfile testfile1″执行后,程序界面中将显示合并后的文件内容,如下所示:
xiongdan 200
lihaihui 233
lymlrl 231
liangyuanm ss
huanggai 56
zhixi 73
若使用paste指令的参数”-s”,则可以将一个文件中的多行数据合并为一行进行显示。例如,将文件”file”中的3行数据合并为一行数据进行显示,输入如下命令
$ paste -s file #合并指定文件的多行数据
上面的命令执行后,显示的数据内容如下所示:
xiongdan 200 lihaihui 233 lymlrl 231
注意:参数”-s”只是将testfile文件的内容调整显示方式,并不会改变原文件的内容格式。
Linux tr命令
Linux tr 命令用于转换或删除文件中的字符。
tr 指令从标准输入设备读取数据,经过字符串转译后,将结果输出到标准输出设备。
语法
tr [-cdst][--help][--version][第一字符集][第二字符集]
tr [OPTION]…SET1[SET2]
参数说明:
• -c, --complement:反选设定字符。也就是符合 SET1 的部份不做处理,不符合的剩余部份才进行转换
• -d, --delete:删除指令字符
• -s, --squeeze-repeats:缩减连续重复的字符成指定的单个字符
• -t, --truncate-set1:削减 SET1 指定范围,使之与 SET2 设定长度相等
• --help:显示程序用法信息
• --version:显示程序本身的版本信息
字符集合的范围:
• NNN 八进制值的字符 NNN (1 to 3 为八进制值的字符)
• \ 反斜杠
• a Ctrl-G 铃声
• b Ctrl-H 退格符
• f Ctrl-L 走行换页
• n Ctrl-J 新行
• r Ctrl-M 回车
• t Ctrl-I tab键
• v Ctrl-X 水平制表符
• CHAR1-CHAR2 :字符范围从 CHAR1 到 CHAR2 的指定,范围的指定以 ASCII 码的次序为基础,只能由小到大,不能由大到小。
• [CHAR*] :这是 SET2 专用的设定,功能是重复指定的字符到与 SET1 相同长度为止
• [CHAR*REPEAT] :这也是 SET2 专用的设定,功能是重复指定的字符到设定的 REPEAT 次数为止(REPEAT 的数字采 8 进位制计算,以 0 为开始)
• [:alnum:] :所有字母字符与数字
• [:alpha:] :所有字母字符
• [:blank:] :所有水平空格
• [:cntrl:] :所有控制字符
• [:digit:] :所有数字
• [:graph:] :所有可打印的字符(不包含空格符)
• [:lower:] :所有小写字母
• [:print:] :所有可打印的字符(包含空格符)
• [:punct:] :所有标点字符
• [:space:] :所有水平与垂直空格符
• [:upper:] :所有大写字母
• [:xdigit:] :所有 16 进位制的数字
• [=CHAR=] :所有符合指定的字符(等号里的 CHAR,代表你可自订的字符)
实例
将文件testfile中的小写字母全部转换成大写字母,此时,可使用如下命令:
cat testfile |tr a-z A-Z
testfile文件中的内容如下:
$ cat testfile #testfile原来的内容
Linux networks are becoming more and more common,
but scurity is often an overlooked
issue. Unfortunately, in today’s environment all networks
are potential hacker targets,
fro0m tp-secret military research networks to small home LANs.
Linux Network Securty focuses on securing Linux in a
networked environment, where the
security of the entire network needs to be considered
rather than just isolated machines.
It uses a mix of theory and practicl techniques to
teach administrators how to install and
use security applications, as well as how the
applcations work and why they are necesary.
使用 tr 命令大小写转换后,得到如下输出结果:
$ cat testfile | tr a-z A-Z #转换后的输出
LINUX NETWORKS ARE BECOMING MORE AND MORE COMMON, BUT SCURITY IS OFTEN AN OVERLOOKED
ISSUE. UNFORTUNATELY, IN TODAY’S ENVIRONMENT ALL NETWORKS ARE POTENTIAL HACKER TARGETS,
FROM TP-SECRET MILITARY RESEARCH NETWORKS TO SMALL HOME LANS.
LINUX NETWORK SECURTY FOCUSES ON SECURING LINUX IN A NETWORKED ENVIRONMENT, WHERE THE
SECURITY OF THE ENTIRE NETWORK NEEDS TO BE CONSIDERED RATHER THAN JUST ISOLATED MACHINES.
IT USES A MIX OF THEORY AND PRACTICL TECHNIQUES TO TEACH ADMINISTRATORS HOW TO INSTALL AND
USE SECURITY APPLICATIONS, AS WELL AS HOW THE APPLCATIONS WORK AND WHY THEY ARE NECESARY.
大小写转换,也可以通过[:lower][:upper]参数来实现。例如使用如下命令:
cat testfile |tr [:lower:] [:upper:]
输出结果如下:
$ cat testfile | tr [:lower:] [:upper:] #转换后的输出
LINUX NETWORKS ARE BECOMING MORE AND MORE COMMON, BUT SCURITY IS OFTEN AN OVERLOOKED
ISSUE. UNFORTUNATELY, IN TODAY’S ENVIRONMENT ALL NETWORKS ARE POTENTIAL HACKER TARGETS,
FROM TP-SECRET MILITARY RESEARCH NETWORKS TO SMALL HOME LANS.
LINUX NETWORK SECURTY FOCUSES ON SECURING LINUX IN A NETWORKED ENVIRONMENT, WHERE THE
SECURITY OF THE ENTIRE NETWORK NEEDS TO BE CONSIDERED RATHER THAN JUST ISOLATED MACHINES.
IT USES A MIX OF THEORY AND PRACTICL TECHNIQUES TO TEACH ADMINISTRATORS HOW TO INSTALL AND
USE SECURITY APPLICATIONS, AS WELL AS HOW THE APPLCATIONS WORK AND WHY THEY ARE NECESARY.
Linux split命令
Linux split命令用于将一个文件分割成数个。
该指令将大文件分割成较小的文件,在默认情况下将按照每1000行切割成一个小文件。
语法
split [--help][--version][-][-b ][-C ][-l ][要切割的文件][输出文件名]
参数说明:
• - : 指定每多少行切成一个小文件
• -b : 指定每多少字节切成一个小文件
• --help : 在线帮助
• --version : 显示版本信息
• -C : 与参数"-b"相似,但是在切 割时将尽量维持每行的完整性
• [输出文件名] : 设置切割后文件的前置文件名, split会自动在前置文件名后再加上编号
实例
使用指令”split”将文件”README”每6行切割成一个文件,输入如下命令:
$ split -6 README #将README文件每六行分割成一个文件
以上命令执行后,指令”split”会将原来的大文件”README”切割成多个以”x”开头的小文件。而在这些小文件中,每个文件都只有6行内容。
使用指令”ls”查看当前目录结构,如下所示:
$ ls #执行ls指令
#获得当前目录结构
README xaa xad xag xab xae xah xac xaf xai
Linux csplit命令
Linux csplit命令用于分割文件。
将文件依照指定的范本样式予以切割后,分别保存成名称为xx00,xx01,xx02…的文件。若给予的文件名称为”-“,则csplit指令会从标准输入设备读取数据。
语法
csplit [-kqsz][-b][-f]
[-n][--help][--version][文件][范本样式...]
参数:
• -b或--suffix-format= 预设的输出格式其文件名称为xx00,xx01...等,您可以通过改变来改变输出的文件名。
• -f或--prefix= 预设的输出字首字符串其文件名为xx00,xx01...等,如果你指定输出字首字符串为"hello",则输出的文件名称会变成hello00,hello01...等。
• -k或--keep-files 保留文件,就算发生错误或中断执行,也不能删除已经输出保存的文件。
• -n或--digits= 预设的输出文件名位数其文件名称为xx00,xx01...等,如果你指定输出文件名位数为"3",则输出的文件名称会变成xx000,xx001...等。
• -q或-s或--quiet或--silent 不显示指令执行过程。
• -z或--elide-empty-files 删除长度为0 Byte文件。
• --help 在线帮助。
• --version 显示版本信息。
实例
将文本文件testfile以第 2 行为分界点切割成两份,使用如下命令:
csplit testfile 2
testfile文件中的内容如下:
$ cat testfile #查看testfile 文件内容
hello Linux!
Linux is a free Unix-type operating system.
This is a Linux testfile!
Linux
使用csplit命令,输出结果如下:
$ csplit testfile 2
13 #xx00文件字符个数
76 #xx01文件字符个数
其中第1 行是第一个文件xx00的字符个数,同样,第2 行为第二个文件xx01的字符个数。同时,在testfile 的同目录下将生成两个文件,文件名分别为xx00、xx01,xx00 中的内容为:
$ cat xx00 #查看分割后的xx00文件内容
hello Linux! #testfile文件第1行的内容
xx01 中的内容为:
$ cat xx01 #查看分割后的xx01文件内容
Linux is a free Unix-type operating system. #testfile文件第2行以后的内容
This is a Linux testfile!
Linux
Linux tee命令
Linux tee命令用于读取标准输入的数据,并将其内容输出成文件。
tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。
语法
tee [-ai][--help][--version][文件...]
参数:
• -a或--append 附加到既有文件的后面,而非覆盖它.
• -i或--ignore-interrupts 忽略中断信号。
• --help 在线帮助。
• --version 显示版本信息。
实例
使用指令”tee”将用户输入的数据同时保存到文件”file1″和”file2″中,输入如下命令:
$ tee file1 file2 #在两个文件中复制内容
以上命令执行后,将提示用户输入需要保存到文件的数据,如下所示:
My Linux #提示用户输入数据
My Linux #输出数据,进行输出反馈
此时,可以分别打开文件”file1″和”file2″,查看其内容是否均是”My Linux”即可判断指令”tee”是否执行成功。
Linux unexpand命令
Linux unexpand命令:空格字符转换为制表符
Linux unexpand命令 语法
unexpand [选项] [文件]
参数:
-a, --all:将所有混合使用制表符和空格的缩进转换为制表符缩进。
-t N, --tabs=N:将每个制表符(tab)扩展为N个空格字符。默认情况下,一个制表符被扩展为8个空格字符。
-i, --initial:仅在行的初始位置之前的制表符扩展为空格。默认情况下,行中的所有制表符都将被扩展为空格。
-u, --ungroup:不要将连续的空格字符合并为制表符。
-t, --truncate-set1:删除多余的空格字符。当缩进中存在多个连续空格字符时,将其缩减为一个空格字符。
-f, --first-only:仅在文件中的第一个制表符处插入空格。后续的制表符将不做处理。
--help:显示帮助信息并退出。
--version:显示版本信息并退出。
示例用法:
- 将制表符缩进转换为空格缩进:
unexpand file.txt
这将从文件file.txt
中读取内容,并将其中的制表符缩进转换为默认的8个空格字符缩进。
- 使用4个空格字符代替制表符缩进:
unexpand -t 4 file.txt
这将将文件file.txt
中的制表符缩进转换为4个空格字符缩进。
- 将混合使用制表符和空格的缩进统一为制表符缩进:
unexpand -a file.txt
这将文件file.txt
中使用制表符和空格混合的缩进统一为制表符缩进。
Linux patch命令
Linux patch命令用于修补文件。
patch指令让用户利用设置修补文件的方式,修改,更新原始文件。倘若一次仅修改一个文件,可直接在指令列中下达指令依序执行。如果配合修补文件的方式则能一次修补大批文件,这也是Linux系统核心的升级方法之一。
语法
patch [-bceEflnNRstTuvZ][-B ][-d ][-D ][-F ][-g ][-i ][-o ][-p ][-r ][-V ][-Y ][-z ][--backup-if -mismatch][--binary][--help][--nobackup-if-mismatch][--verbose][原始文件 ] 或 path [-p ]
参数:
• -b或--backup 备份每一个原始文件。
• -B或--prefix= 设置文件备份时,附加在文件名称前面的字首字符串,该字符串可以是路径名称。
• -c或--context 把修补数据解译成关联性的差异。
• -d或--directory= 设置工作目录。
• -D或--ifdef= 用指定的符号把改变的地方标示出来。
• -e或--ed 把修补数据解译成ed指令可用的叙述文件。
• -E或--remove-empty-files 若修补过后输出的文件其内容是一片空白,则移除该文件。
• -f或--force 此参数的效果和指定"-t"参数类似,但会假设修补数据的版本为新 版本。
• -F或--fuzz 设置监别列数的最大值。
• -g或--get= 设置以RSC或SCCS控制修补作业。
• -i或--input= 读取指定的修补文件。
• -l或--ignore-whitespace 忽略修补数据与输入数据的跳格,空格字符。
• -n或--normal 把修补数据解译成一般性的差异。
• -N或--forward 忽略修补的数据较原始文件的版本更旧,或该版本的修补数据已使 用过。
• -o或--output= 设置输出文件的名称,修补过的文件会以该名称存放。
• -p或--strip= 设置欲剥离几层路径名称。
• -f或--reject-file= 设置保存拒绝修补相关信息的文件名称,预设的文件名称为.rej。
• -R或--reverse 假设修补数据是由新旧文件交换位置而产生。
• -s或--quiet或--silent 不显示指令执行过程,除非发生错误。
• -t或--batch 自动略过错误,不询问任何问题。
• -T或--set-time 此参数的效果和指定"-Z"参数类似,但以本地时间为主。
• -u或--unified 把修补数据解译成一致化的差异。
• -v或--version 显示版本信息。
• -V或--version-control= 用"-b"参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,这个字符串不仅可用"-z"参数变更,当使用"-V"参数指定不同备份方式时,也会产生不同字尾的备份字符串。
• -Y或--basename-prefix=-- 设置文件备份时,附加在文件基本名称开头的字首字符串。
• -z或--suffix= 此参数的效果和指定"-B"参数类似,差别在于修补作业使用的路径与文件名若为src/linux/fs/super.c,加上"backup/"字符串后,文件super.c会备份于/src/linux/fs/backup目录里。
• -Z或--set-utc 把修补过的文件更改,存取时间设为UTC。
• --backup-if-mismatch 在修补数据不完全吻合,且没有刻意指定要备份文件时,才备份文件。
• --binary 以二进制模式读写数据,而不通过标准输出设备。
• --help 在线帮助。
• --nobackup-if-mismatch 在修补数据不完全吻合,且没有刻意指定要备份文件时,不要备份文件。
• --verbose 详细显示指令的执行过程。
实例
使用patch指令将文件”testfile1″升级,其升级补丁文件为”testfile.patch”,输入如下命令:
$ patch -p0 testfile1 testfile.patch #使用补丁程序升级文件
使用该命令前,可以先使用指令”cat”查看”testfile1″的内容。在需要修改升级的文件与原文件之间使用指令”diff”比较可以生成补丁文件。具体操作如下所示:
$ cat testfile1 #查看testfile1的内容
Hello,This is the firstfile!
$ cat testfile2 #查看testfile2的内容
Hello,Thisisthesecondfile!
$ diff testfile1 testfile2 #比较两个文件
1c1
Hello,Thisisthesecondfile!
#将比较结果保存到testfile.patch文件
$ diff testfile1 testfile2>testfile.patch
$ cat testfile.patch #查看补丁包的内容
1c1
Hello,Thisisthesecondfile!
#使用补丁包升级testfile1文件
$ patch -p0 testfile1 testfile.patch
patching file testfile1
$cat testfile1 #再次查看testfile1的内容
#testfile1文件被修改为与testfile2一样的内容
Hello,This is the secondfile!
注意:上述命令代码中,”$ diff testfile1 testfile2>testfile. patch”所使用的操作符”>”表示将该操作符左边的文件数据写入到右边所指向的文件中。在这里,即是指将两个文件比较后的结果写入到文件”testfile.patch”中。
Linux awk 命令
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
语法
awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
选项参数说明:
-
-F fs
:指定输入字段分隔符,将输入的每行按照fs
进行分割,其中fs
可以是空格、制表符或其他字符串。 -
-v var=value
:定义一个awk
变量,并赋予其值。 -
-f file
:从指定的脚本文件中读取awk
命令。 -
-F
:设置输入分隔符为当前正在处理的文件输入的第一个字符。 -
-O
:设置变量FS
(字段分隔符)为当前正在处理的文件输入的第一个字符。 -
-WS
:识别动态长度字段分隔符。 -
-W keyword
:启用非标准的awk
扩展功能,其中keyword
是以下选项之一:
-
assign
:启用赋值语句 -
traditional
:启用传统模式,关闭gsub()
函数以及其他非标准功能。 -
compat
:启用兼容模式,启用old awk
的相关特性。 -
lint
:检查脚本中的语法错误。
-
--
:指示awk
停止处理选项,并将剩余的参数视为文件名。 -
-W version
:显示awk
的版本信息并退出。 -
--field-separator fs
:与-F fs
选项相同,指定输入字段分隔符。 -
--assign var=value
:与-v var=value
选项相同,定义一个awk
变量。 -
--file file
:与-f file
选项相同,指定要执行的脚本文件。
基本用法
log.txt文本内容如下:
2 this is a test
3 Do you like awk
This's a test
10 There are orange,apple,mongo
用法一:
awk '{[pattern] action}' {filenames} # 行匹配语句 awk '' 只能用单引号
实例:
# 每行按空格或TAB分割,输出文本中的1、4项
$ awk '{print $1,$4}' log.txt
---------------------------------------------
2 a
3 like
This's
10 orange,apple,mongo
# 格式化输出
$ awk '{printf "%-8s %-10sn",$1,$4}' log.txt
---------------------------------------------
2 a
3 like
This's
10 orange,apple,mongo
用法二:
awk -F #-F相当于内置变量FS, 指定分割字符
实例:
# 使用","分割
$ awk -F, '{print $1,$2}' log.txt
---------------------------------------------
2 this is a test
3 Do you like awk
This's a test
10 There are orange apple
# 或者使用内建变量
$ awk 'BEGIN{FS=","} {print $1,$2}' log.txt
---------------------------------------------
2 this is a test
3 Do you like awk
This's a test
10 There are orange apple
# 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
$ awk -F '[ ,]' '{print $1,$2,$5}' log.txt
---------------------------------------------
2 this test
3 Are awk
This's a
10 There apple
用法三:
awk -v # 设置变量
实例:
$ awk -va=1 '{print $1,$1+a}' log.txt
---------------------------------------------
2 3
3 4
This's 1
10 11
$ awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt
---------------------------------------------
2 3 2s
3 4 3s
This's 1 This'ss
10 11 10s
用法四:
awk -f {awk脚本} {文件名}
实例:
$ awk -f cal.awk log.txt
运算符
运算符 |
描述 |
= += -= *= /= %= ^= **= |
赋值 |
?: |
C条件表达式 |
|| |
逻辑或 |
&& |
逻辑与 |
~ 和 !~ |
匹配正则表达式和不匹配正则表达式 |
>= != == |
关系运算符 |
空格 |
连接 |
+ – |
加,减 |
* / % |
乘,除与求余 |
+ – ! |
一元加,减和逻辑非 |
^ *** |
求幂 |
++ — |
增加或减少,作为前缀或后缀 |
$ |
字段引用 |
in |
数组成员 |
过滤第一列大于2的行
$ awk '$1>2' log.txt #命令
#输出
3 Do you like awk
This's a test
10 There are orange,apple,mongo
过滤第一列等于2的行
$ awk '$1==2 {print $1,$3}' log.txt #命令
#输出
2 is
过滤第一列大于2并且第二列等于’Are’的行
$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt #命令
#输出
3 Are you
只显示最近登录系统的5个用户
只显示/etc/passwd文件中的账户:
内建变量
变量 |
描述 |
$n |
当前记录的第n个字段,字段间由FS分隔 |
$0 |
完整的输入记录 |
ARGC |
命令行参数的数目 |
ARGIND |
命令行中当前文件的位置(从0开始算) |
ARGV |
包含命令行参数的数组 |
CONVFMT |
数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 |
ERRNO |
最后一个系统错误的描述 |
FIELDWIDTHS |
字段宽度列表(用空格键分隔) |
FILENAME |
当前文件名 |
FNR |
各文件分别计数的行号 |
FS |
字段分隔符(默认是任何空格) |
IGNORECASE |
如果为真,则进行忽略大小写的匹配 |
NF |
一条记录的字段的数目 |
NR |
已经读出的记录数,就是行号,从1开始 |
OFMT |
数字的输出格式(默认值是%.6g) |
OFS |
输出字段分隔符,默认值与输入字段分隔符一致。 |
ORS |
输出记录分隔符(默认值是一个换行符) |
RLENGTH |
由match函数所匹配的字符串的长度 |
RS |
记录分隔符(默认是一个换行符) |
RSTART |
由match函数所匹配的字符串的第一个位置 |
SUBSEP |
数组下标分隔符(默认值是/034) |
$ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4sn","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4sn",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
FILENAME ARGC FNR FS NF NR OFS ORS RS
---------------------------------------------
log.txt 2 1 5 1
log.txt 2 2 5 2
log.txt 2 3 3 3
log.txt 2 4 4 4
$ awk -F' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4sn","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4sn",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt
FILENAME ARGC FNR FS NF NR OFS ORS RS
---------------------------------------------
log.txt 2 1 ' 1 1
log.txt 2 2 ' 1 2
log.txt 2 3 ' 2 3
log.txt 2 4 ' 1 4
# 输出顺序号 NR, 匹配文本行号
$ awk '{print NR,FNR,$1,$2,$3}' log.txt
---------------------------------------------
1 1 2 this is
2 2 3 Are you
3 3 This's a test
4 4 10 There are
# 指定输出分割符
$ awk '{print $1,$2,$5}' OFS=" $ " log.txt
---------------------------------------------
2 $ this $ test
3 $ Are $ awk
This's $ a $
10 $ There $
使用正则,字符串匹配
# 输出第二列包含 "th",并打印第二列与第四列
$ awk '$2 ~ /th/ {print $2,$4}' log.txt
---------------------------------------------
this a
~ 表示模式开始。// 中是模式。
# 输出包含 "re" 的行
$ awk '/re/ ' log.txt
---------------------------------------------
3 Do you like awk
10 There are orange,apple,mongo
忽略大小写
$ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
---------------------------------------------
2 this is a test
This's a test
模式取反
$ awk '$2 !~ /th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo
$ awk '!/th/ {print $2,$4}' log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo
awk脚本
关于 awk 脚本,我们需要注意两个关键词 BEGIN 和 END。
- BEGIN{ 这里面放的是执行前的语句 }
- END {这里面放的是处理完所有的行后要执行的语句 }
- {这里面放的是处理每一行时要执行的语句}
假设有这么一个文件(学生成绩表):
$ cat score.txt
Marry 2143 78 84 77
Jack 2321 66 78 45
Tom 2122 48 77 71
Mike 2537 87 97 95
Bob 2415 40 57 62
我们的 awk 脚本如下:
$ cat cal.awk
#!/bin/awk -f
#运行前
BEGIN {
math = 0
english = 0
computer = 0
printf "NAME NO. MATH ENGLISH COMPUTER TOTALn"
printf "---------------------------------------------n"
}
#运行中
{
math+=$3
english+=$4
computer+=$5
printf "%-6s %-6s %4d %8d %8d %8dn", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
END {
printf "---------------------------------------------n"
printf " TOTAL:%10d %8d %8d n", math, english, computer
printf "AVERAGE:%10.2f %8.2f %8.2fn", math/NR, english/NR, computer/NR
}
我们来看一下执行结果:
$ awk -f cal.awk score.txt
NAME NO. MATH ENGLISH COMPUTER TOTAL
---------------------------------------------
Marry 2143 78 84 77 239
Jack 2321 66 78 45 189
Tom 2122 48 77 71 196
Mike 2537 87 97 95 279
Bob 2415 40 57 62 159
---------------------------------------------
TOTAL: 319 393 350
AVERAGE: 63.80 78.60 70.00
另外一些实例
AWK 的 hello world 程序为:
BEGIN { print "Hello, world!" }
计算文件大小
$ ls -l *.txt | awk '{sum+=$5} END {print sum}'
--------------------------------------------------
666581
从文件中找出长度大于 80 的行:
awk 'length>80' log.txt
打印九九乘法表
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i
Linux sed命令
Linux sed 命令是利用脚本来处理文本文件。
sed 可依照脚本的指令来处理、编辑文本文件。
Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
语法
sed [-hnV][-e][-f][文本文件]
参数说明:
- -e或–expression= 以选项中指定的script来处理输入的文本文件。
- -f或–file= 以选项中指定的script文件来处理输入的文本文件。
- -h或–help 显示帮助。
- -n或–quiet或–silent 仅显示script处理后的结果。
- -V或–version 显示版本信息。
动作说明:
- a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
- c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
- d :删除,因为是删除啊,所以 d 后面通常不接任何东东;
- i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
- p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
- s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正则表达式!例如 1,20s/old/new/g 就是啦!
实例
我们先创建一个 testfile 文件,内容如下:
$ cat testfile #查看testfile 中的内容
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
Google
Taobao
Runoob
Tesetfile
Wiki
在 testfile 文件的第四行后添加一行,并将结果输出到标准输出,在命令行提示符下输入如下命令:
sed -e 4anewLine testfile
使用 sed 命令后,输出结果如下:
$ sed -e 4anewLine testfile
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
newLine
Google
Taobao
Runoob
Tesetfile
Wiki
以行为单位的新增/删除
将 testfile 的内容列出并且列印行号,同时,请将第 2~5 行删除!
$ nl testfile | sed '2,5d'
1 HELLO LINUX!
6 Taobao
7 Runoob
8 Tesetfile
9 Wiki
sed 的动作为 2,5d,那个 d 是删除的意思,因为删除了 2-5 行,所以显示的数据就没有 2-5 行了, 另外,原本应该是要下达 sed -e 才对,但没有 -e 也是可以的,同时也要注意的是, sed 后面接的动作,请务必以 ‘…’ 两个单引号括住喔!
只要删除第 2 行:
$ nl testfile | sed '2d'
1 HELLO LINUX!
3 This is a linux testfile!
4 Linux test
5 Google
6 Taobao
7 Runoob
8 Tesetfile
9 Wiki
要删除第 3 到最后一行:
$ nl testfile | sed '3,$d'
1 HELLO LINUX!
2 Linux is a free unix-type opterating system.
在第二行后(即加在第三行) 加上drink tea? 字样:
$ nl testfile | sed '2a drink tea'
1 HELLO LINUX!
2 Linux is a free unix-type opterating system.
drink tea
3 This is a linux testfile!
4 Linux test
5 Google
6 Taobao
7 Runoob
8 Tesetfile
9 Wiki
如果是要在第二行前,命令如下:
$ nl testfile | sed '2i drink tea'
1 HELLO LINUX!
drink tea
2 Linux is a free unix-type opterating system.
3 This is a linux testfile!
4 Linux test
5 Google
6 Taobao
7 Runoob
8 Tesetfile
9 Wiki
如果是要增加两行以上,在第二行后面加入两行字,例如 Drink tea or ….. 与 drink beer?
$ nl testfile | sed '2a Drink tea or ......
drink beer ?'
1 HELLO LINUX!
2 Linux is a free unix-type opterating system.
Drink tea or ......
drink beer ?
3 This is a linux testfile!
4 Linux test
5 Google
6 Taobao
7 Runoob
8 Tesetfile
9 Wiki
每一行之间都必须要以反斜杠 来进行新行标记。上面的例子中,我们可以发现在第一行的最后面就有 存在。
以行为单位的替换与显示
将第 2-5 行的内容取代成为 No 2-5 number 呢?
$ nl testfile | sed '2,5c No 2-5 number'
1 HELLO LINUX!
No 2-5 number
6 Taobao
7 Runoob
8 Tesetfile
9 Wiki
透过这个方法我们就能够将数据整行取代了。
仅列出 testfile 文件内的第 5-7 行:
$ nl testfile | sed -n '5,7p'
5 Google
6 Taobao
7 Runoob
可以透过这个 sed 的以行为单位的显示功能, 就能够将某一个文件内的某些行号选择出来显示。
数据的搜寻并显示
搜索 testfile 有 oo 关键字的行:
$ nl testfile | sed -n '/oo/p'
5 Google
7 Runoob
如果 root 找到,除了输出所有行,还会输出匹配行。
数据的搜寻并删除
删除 testfile 所有包含 oo 的行,其他行输出
$ nl testfile | sed '/oo/d'
1 HELLO LINUX!
2 Linux is a free unix-type opterating system.
3 This is a linux testfile!
4 Linux test
6 Taobao
8 Tesetfile
9 Wiki
数据的搜寻并执行命令
搜索 testfile,找到 oo 对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把 oo 替换为 kk,再输出这行:
$ nl testfile | sed -n '/oo/{s/oo/kk/;p;q}'
5 Gkkgle
最后的 q 是退出。
数据的查找与替换
除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的查找与替换
sed 的查找与替换的与 vi 命令类似,语法格式如下:
sed 's/要被取代的字串/新的字串/g'
将 testfile 文件中每行第一次出现的 oo 用字符串 kk 替换,然后将该文件内容输出到标准输出:
sed -e 's/oo/kk/' testfile
g 标识符表示全局查找替换,使 sed 对文件中所有符合的字符串都被替换,修改后内容会到标准输出,不会修改原文件:
sed -e 's/oo/kk/g' testfile
选项 i 使 sed 修改文件:
sed -i 's/oo/kk/g' testfile
批量操作当前目录下以 test 开头的文件:
sed -i 's/oo/kk/g' ./test*
接下来我们使用 /sbin/ifconfig 查询 IP:
$ /sbin/ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84
inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
.....(以下省略).....
本机的 ip 是 192.168.1.100。
将 IP 前面的部分予以删除:
$ /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'
192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
接下来则是删除后续的部分,即:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0。
将 IP 后面的部分予以删除:
$ /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
192.168.1.100
多点编辑
一条 sed 命令,删除 testfile 第三行到末尾的数据,并把 HELLO 替换为 RUNOOB :
$ nl testfile | sed -e '3,$d' -e 's/HELLO/RUNOOB/'
1 RUNOOB LINUX!
2 Linux is a free unix-type opterating system.
-e 表示多点编辑,第一个编辑命令删除 testfile 第三行到末尾的数据,第二条命令搜索 HELLO 替换为 RUNOOB。
直接修改文件内容(危险动作)
sed 可以直接修改文件的内容,不必使用管道命令或数据流重导向! 不过,由于这个动作会直接修改到原始的文件,所以请你千万不要随便拿系统配置来测试! 我们还是使用文件 regular_express.txt 文件来测试看看吧!
regular_express.txt 文件内容如下:
$ cat regular_express.txt
runoob.
google.
taobao.
facebook.
zhihu-
weibo-
利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !
$ sed -i 's/.$/!/g' regular_express.txt
$ cat regular_express.txt
runoob!
google!
taobao!
facebook!
zhihu-
weibo-
:q:q
利用 sed 直接在 regular_express.txt 最后一行加入 # This is a test:
$ sed -i '$a # This is a test' regular_express.txt
$ cat regular_express.txt
runoob!
google!
taobao!
facebook!
zhihu-
weibo-
# This is a test
由於 $ 代表的是最后一行,而 a 的动作是新增,因此该文件最后新增 # This is a test!
sed 的 -i 选项可以直接修改文件内容,这功能非常有帮助!举例来说,如果你有一个 100 万行的文件,你要在第 100 行加某些文字,此时使用 vim 可能会疯掉!因为文件太大了!那怎办?就利用 sed 啊!透过 sed 直接修改/取代的功能,你甚至不需要使用 vim 去修订!
服务器租用托管,机房租用托管,主机租用托管,https://www.e1idc.com