LINUX核心命令实战总结四——文件过滤及内容编辑处理命令一
1.1 cat:合并文件或查看文件内容
【功能说明】
命令cat查看文件内容
命令cat的常用5个功能
序号 |
Cat常用功能 |
简要例子说明 |
1 |
查看文件内容 |
例如:cat file1.txt |
2 |
把多个文件合并在一起 |
例如:cat file1.txt file2.txt >>newfile.txt |
3 |
创建编辑新文件 |
例如:输入cat>file.txt,后面接要编辑的内容,使用快捷方式Ctrl+d或Ctrl+c可结束编辑。极少使用 |
4 |
非交互式的编辑或者追加内容到文杰尾部 |
这是生产工作中最重要的一个应用,所以要很熟练 例如:cat >> file.txt << EFO I am yanhuihuang I 24 year old EFO |
5 |
清空文件内容 |
例如:使用cat /dev/null>file.txt命令就可以把文件内容清空,但是文件还是存在的,偶尔使用。 |
【语法格式】
cat [OPTION]... [FILE]...
cat [选项]... [文件]...
【选项说明】
命令cat的参数选项及说明
参数选项 |
解释说明(带*的为重点) |
-n |
从1开始所有输出的内容按行编号(*) |
-b |
和-n选项功能类似,但会忽略显示空白行行号。 |
-s |
当遇到有连续两行以上的空白行时,就替换为一行空白 |
-A |
等价于-vET三个选项的功能之和 |
-e |
等价于 -vE |
-E |
在每行结尾显示$符号 |
-t |
与-vT等价 |
-T |
将Tab字符显示为^1 |
-v |
除了LDF和TAB之外,使用^和-M引用 |
【使用范例】
基础范例:
执行如下的完整命令生成test.txt文件内容
[root@web01 ~]# cat > test.txt <<EFO > I love you > I am yanhuihuang > very good > EFO
以上执行过程及结果:
[root@web01 ~]# cat test.txt > I love you > I am yanhuihuang > very good you are very good
执行cat命令,分别带-n及-b选项,并对区别
[root@web01 ~]# cat -n test.txt 1 > I love you 2 > I am yanhuihuang 3 > very good 4 5 6 7 8 9 10 11 you are very good [root@web01 ~]# cat -b test.txt 1 > I love you 2 > I am yanhuihuang 3 > very good 4 you are very good
执行cat命令,带-E选项
[root@web01 ~]# cat -E test.txt > I love you$ > I am yanhuihuang$ > very good$ $ $ $ $ $ $ $ you are very good$
执行cat命令,带-s选项
[root@web01 ~]# cat -s test.txt > I love you > I am yanhuihuang > very good you are very good
执行cat命令编辑新文本
[root@web01 ~]# cat test2.txt hello world [root@web01 ~]# cat test.txt test2.txt > I love you > I am yanhuihuang > very good you are very good hello world
1.2 tac:反向显示文件内容
【功能说明】
命令tac是cat的反向拼写
【语法格式】
tac [OPTION]... [FILE]...
tac [选项]... [文件]...
【选项说明】
命令tac的参数选项及说明
参数选项 |
解释说明(带*的为重点) |
-b |
在行前而非行尾添加分隔标志 |
-r |
将分隔标记视作正则表达式来解析 |
-s |
使用指定字符串替换行作为分隔标志 |
【使用范例】
命令cat和tac对比
[root@web01 ~]# cat /etc/rc.local #!/bin/sh # # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the full Sys V style init stuff. touch /var/lock/subsys/local >/etc/udev/rules.d/70-persistent-net.rules [root@web01 ~]# tac /etc/rc.local >/etc/udev/rules.d/70-persistent-net.rules touch /var/lock/subsys/local # want to do the full Sys V style init stuff. # You can put your own initialization stuff in here if you don't # This script will be executed *after* all the other init scripts. # #!/bin/sh
1.3 more:分页显示文件内容
【功能说明】
命令more的功能类似于cat,但more会一页一页显示内容。
【语法格式】
more [option] [file ...]
more [选项] [文件...]
【选项说明】
命令more的参数选项及说明
参数选项 |
解释说明(带*的为重点) |
-num |
指定屏幕显示大小为num行 |
+num |
从行号num开始显示(*) |
-s |
把连续的多个空行显示为一行 |
-p |
不滚屏,而是清除整个屏幕,然后显示文本 |
-c |
不滚屏,而是从每一屏的顶部开始显示文本,没显示完一行,就清除一行 |
命令more的交换式子命令及说明
参数选项 |
解释说明(带*的为重点) |
H或? |
查看帮助 |
空格键 |
向下滚动一屏(*) |
z |
向下滚动一屏 |
Enter |
向下滚动一行 |
f |
向下滚动一屏 |
b |
向上滚动一屏 |
= |
输出当前的行号 |
/查看的文本 |
查找指定的文本 |
:f |
输出文件名和当前行的行号 |
v |
调用vi编辑器 |
!命令 |
调用shell并执行命令 |
q |
退出并保存 |
【使用范例】
命令more后面不接任何参数
[root@web01 ~]# more /etc/services # /etc/services: # $Id: services,v 1.48 2009/11/11 14:32:31 ovasik Exp $ # # Network services, Internet style # IANA services version: last updated 2009-11-10 ....... ....... echo 7/udp discard 9/tcp sink null discard 9/udp sink null
定义显示行数
[root@web01 ~]# more -5 /etc/services # /etc/services: # $Id: services,v 1.48 2009/11/11 14:32:31 ovasik Exp $ # # Network services, Internet style # IANA services version: last updated 2009-11-10
从指定的行数开始显示
[root@web01 ~]# more +888 /etc/services cableport-ax 282/tcp # Cable Port A/X cableport-ax 282/udp # Cable Port A/X rescap 283/tcp # rescap rescap 283/udp # rescap corerjd 284/tcp # corerjd corerjd 284/udp
【技巧示范】
分页显示目录下的内容
[root@web01 ~]# ls /etc/|more -10 abrt acpi adjtime aliases aliases.db alsa alternatives anacrontab asound.conf at.deny
1.4 less:分页显示文件内容
【功能说明】
命令less指针式记录打开文档,快速,消耗少量内存。
【语法格式】
less [option] [file]
less [选项] [文档]
【选项说明】
命令less的参数选项及说明
参数选项 |
解释说明(带*的为重点) |
-i |
搜索时忽略大小写 |
-m |
显示类似于more命令的进度百分比 |
-N |
显示每行行号 |
-s |
将连续的空行压缩为一行显示 |
-e |
当文件显示到结尾时自动退出文件,若不使用此选项就需要使用交互命令q退出 |
【使用范例】
[root@web01 ~]# less /etc/services # /etc/services: # $Id: services,v 1.48 2009/11/11 14:32:31 ovasik Exp $ # ...... ....... # http://www.iana.org/assignments/port-numbers # The Well Known Ports are those from 0 through 1023. # The Registered Ports are those from 1024 through 49151 # The Dynamic and/or Private
显示行号例子
[root@web01 ~]# less -N /etc/services 1 # /etc/services: 2 # $Id: services,v 1.48 2009/11/11 14:32:31 ovasik Exp $ 3 # 4 # Network services, Internet style 5 # IANA services version: last updated 2009-11-10
【技巧性范例】
[root@web01 ~]# ls /etc/|less
abrt
acpi
adjtime
aliases
aliases.db
alsa
alternatives
anacrontab
asound.conf
at.deny
audisp
1.5 head:显示文件内部头部
【功能说明】
命令head用于显示文件头部,默认显示文件前10行
【语法格式】
head [OPTION]... [FILE]...
head [选项]... [文件]...
【选项说明】
命令head参数及说明
参数选项 |
解释说明(带*的为重点) |
-n |
指定显示的行数 |
-c |
指定显示的字节数 |
-q |
不显示包含给定文件名的文件头 |
-v |
总是显示包含给定文件名的文件夹 |
【使用范例】
默认显示文件的前10行例子
root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
显示文件的前n行
[root@web01 ~]# head -n 5 /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
显示前n个字节
[root@web01 ~]# head -c 10 /etc/passwd root:x:0:0[root@web01 ~]#
显示文件的最后n行或者n个字节
[root@web01 ~]# head -n -21 /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt
显示多个文件
[root@web01 ~]# head -1 /etc/passwd root:x:0:0:root:/root:/bin/bash
1.6 tail:显示文件内容尾部
【功能说明】
命令tail用于显示文件内容的尾部
【语法格式】
tail [OPTION]... [FILE]...
tail [选项]... [文件]...
【选项说明】
命令tail的参数选项及说明
参数选项 |
解释说明(带*的为重点) |
-c |
指定显示的字节数 |
-n |
指定显示的行数 |
-f |
实时输出文件变化后追加的数据(*) |
-F |
功能等同于-f --retry |
--retry |
不停地尝试打开文件直到打开为止,和-f参数和用 |
--pid |
与-f参数合用,在进程结束后自动退出tail命令 |
-s |
监督文件变化的时间的间隔数(秒) |
-q |
不显示包含给定文件名的文件头 |
-v |
总是显示包含给定文件名的文件头 |
【使用范例】
[root@web01 ~]# tail /etc/passwd rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin haldaemon:x:68:68:HAL daemon:/:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin oprofile:x:16:16:Special user account to be used by OProfile:/home/oprofile:/sbin/nologin yhh:x:500:500::/home/yhh:/bin/bash
显示文件末尾5行的内容
[root@web01 ~]# tail -n 5 /etc/passwd postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin oprofile:x:16:16:Special user account to be used by OProfile:/home/oprofile:/sbin/nologin yhh:x:500:500::/home/yhh:/bin/bash
从第十五行开始显示文件
[root@web01 ~]# tail -n +15 /etc/passwd nobody:x:99:99:Nobody:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin abrt:x:173:173::/etc/abrt:/sbin/nologin rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin haldaemon:x:68:68:HAL daemon:/:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin oprofile:x:16:16:Special user account to be used by OProfile:/home/oprofile:/sbin/nologin yhh:x:500:500::/home/yhh:/bin/bash
实时监控文件变化
[root@web01 ~]# echo abc >> aa
[root@web01 ~]#
[root@web01 ~]# tail -f aa 111 222 abc
参数-F的使用
[root@web01 ~]# tail -f a tail: 无法打开"a" 读取数据: 没有那个文件或目录 tail: 没有剩余文件 [root@web01 ~]# tail -F a tail: 无法打开"a" 读取数据: 没有那个文件或目录 ^C [root@web01 ~
1.7 tailf:跟踪日志文件
【功能说明】
命令tailf几乎和tail -f相同,不同的是如果文件不增长,那么它不会去访问磁盘文件,也不会更改文件的访问时间
【语法格式】
tailf [OPTION] file
tailf [选项] 文件
【选项说明】
命令tailf的参数选项及说明
参数选项 |
解释说明(带*的为重点) |
-n |
指定显示的行数,默认是最后10行 |
【使用范例】
跟踪日志文件
[root@web01 ~]# tailf aa 111 222 abc abc1
[root@web01 ~]# echo abc1 >> aa
[root@web01 ~]#
1.8 cut:从文本中提取一段文字并输入
【功能说明】
命令cut从文件的每行剪切字节,字符或字段,并将这些字节,字符或字段输出至标准输出
【语法格式】
cut OPTION... [FILE]...
cut 选项... [文件]...
【选项说明】
命令cut的参数选项及说明
参数选项 |
解释说明(带*的为重点) |
-b |
以字节为单位进行分割 |
-n |
取消分隔多字节字符,与选项-b一起使用 |
-c |
以字节为单位进行分隔(*) |
-d |
自定义分隔符,默认以tab为分隔符 |
-f |
与-d一起使用,指定显示那个区域(*) |
N |
第N个字节,字符或字段 |
N- |
从第N个字节、字符或字段开始至行尾(*) |
N-M |
从第N个到M个字节、字符或字段开始至行尾(*) |
-M |
从第1个到M个字节、字符或字段开始至行尾(*) |
【使用范例】
以字节为分隔符
[root@web01 ~]# echo I am yanhuihuang my QQ is 88888888 >aa [root@web01 ~]# cat aa I am yanhuihuang my QQ is 88888888 [root@web01 ~]# cut -b -3 aa I a [root@web01 ~]# cut -b 3- aa am yanhuihuang my QQ is 88888888 [root@web01 ~]# cut -b -3,3- aa I am yanhuihuang my QQ is 88888888
以字节为分隔符(英文字母是单字节字符)
[root@web01 ~]# cut -c 2-10 aa am yanhu [root@web01 ~]# cut -b 2-10 aa am yanhu
自定义分隔例子
[root@web01 ~]# cut -d : -f 1 /etc/passwd root bin ........ ........ yanhuihuang yanhuihuang1
1.9 split:分隔文件
【功能说明】
命令split可以按照指定的行数或者指定文件大小进行分隔
【语法格式】
split [OPTION]... [INPUT ] [PREFIX]
split [选项]... [输入文件 ] [输出文件名前缀]
【选项说明】
split [OPTION]... [INPUT ] [PREFIX]
split [选项]... [输入文件 ] [输出文件名前缀]
命令split的参数选项及说明
参数选项 |
解释说明(带*的为重点) |
-b |
指定分隔文件的最大字节数 |
-l |
指定分隔后文件的最大行数 |
-a |
指定后缀长度,默认为2位字母 |
-d |
使用数字后缀 |
【使用范例】
[root@web01 data]# split -l 10 inittab new_ [root@web01 data]# ls new* new_aa new_ab new_ac [root@web01 data]# split -l 10 -d inittab new2_ [root@web01 data]# wc -l new2_* 10 new2_00 10 new2_01 6 new2_02 10 new2_aaa 10 new2_aab 6 new2_aac 52 总用量
按照文件大小分隔
[root@web01 data]# split -b 1k -d inittab new3_ [root@web01 data]# ls new3* new3_00
1.10 paste:合并文件
【功能说明】
命令paste能将文件按照行与行进行合并,中间使用tab隔开。
【语法格式】
paste [OPTION]... [FILE]...
paste [选项]... [文件]...
【选项说明】
命令paste的参数选项及说明
参数选项 |
解释说明(带*的为重点) |
-d |
指定合并的分隔符,默认是TAB(*) |
-s |
每个文件占用一行 |
【使用范例】
[root@web01 data]# paste test1 test2 1 aaaa 2 bbbbb 3 cccccc 4 5 6
通过-d可以指定分隔符
[root@web01 data]# paste -d : test1 test2 1:aaaa 2:bbbbb 3:cccccc 4: 5:eeeeeeeeeeeeee 6:ggggggg
通过-s合并内容,使其成行
[root@web01 data]# paste -s test1 1 2 3 4 5 6 [root@web01 data]# paste -s test2 aaaa bbbbb cccccc eeeeeeeeeeeeee ggggggg [root@web01 data]# paste -s test1 test2 1 2 3 4 5 6 aaaa bbbbb cccccc eeeeeeeeeeeeee ggggggg
与cat命令合并文本的方式进行对比
[root@web01 data]# cat test1 test2 1 2 3 4 5 6 aaaa bbbbb cccccc eeeeeeeeeeeeee ggggggg
【生产案例】
假设通过shell脚本生成的账号密码如下:
stu001
7f77sj
stu002
tsuydh
stu003
dhksnk
stu004
xdkack
stu005
dxhiai
stu006
nbkcac
stu007
dbakk1
stu008
dbm09s
现在要求使用命令将上面文本转换成SVN服务配置文件的账号及密码格式
stu001=7f77sj stu002=tsuydh stu003=dhksnk stu004=xdkack stu005=dxhiai stu006=nbkcac stu007=dbakk1 stu008=dbm09s
方法一:
[root@web01 data]# paste -s test4 stu001 7f77sj stu002 tsuydh stu003 dhksnk stu004 xdkack stu005 dxhiai stu006 nbkcac stu007 dbakk1 stu008 dbm09s [root@web01 data]# paste -sd '=\n' test4 stu001=7f77sj stu002=tsuydh stu003=dhksnk stu004=xdkack stu005=dxhiai stu006=nbkcac stu007=dbakk1 stu008=dbm09s
方法二:
[root@web01 data]# paste -d '=' - - <test4 stu001=7f77sj stu002=tsuydh stu003=dhksnk stu004=xdkack stu005=dxhiai stu006=nbkcac stu007=dbakk1 stu008=dbm09s
方法三:xargs+sed命令实现
[root@web01 data]# xargs -n 2 < test4 stu001 7f77sj stu002 tsuydh stu003 dhksnk stu004 xdkack stu005 dxhiai stu006 nbkcac stu007 dbakk1 stu008 dbm09s [root@web01 data]# xargs -n 2 < test4|sed 's# #=#g' stu001=7f77sj stu002=tsuydh stu003=dhksnk stu004=xdkack stu005=dxhiai stu006=nbkcac stu007=dbakk1 stu008=dbm09s
方法四:
[root@web01 data]# sed 'N;s#\n#=#g' test4 stu001=7f77sj stu002=tsuydh stu003=dhksnk stu004=xdkack stu005=dxhiai stu006=nbkcac stu007=dbakk1 stu008=dbm09s