Linux系统运维常用命令(3)

186 阅读18分钟

9、系统其它(25个) echo 打印变量,直接输出指定的字符串 printf 将结果格式化输出到标准输出中。 rpm 管理rpm包命令。 yum 自动化简单化地管理rpm包的命令。 watch 周期的执行给定的命令,并将命令的输出以全屏方式显示。 alias 设置系统别名。 unalias 取消系统别名。 date 查看、设置系统时间。 clear 清除屏幕,简称清屏。 history 查看命令执行的历史纪录。 eject 弹出光驱。 time 计算命令执行时间。 nc 功能强大网络工具。 xargs 将标准输入转换成命令行的参数。 exec 调用并执行指令的命令。 export 设置或者显示环境变量。 unset 删除变量、函数。 type 用于判断另外一个命令是否为内置的命令。 bc 命令行科学计算器 系统管理、性能监视命令(9个) chkconfig 管理Linux系统开机启动项。 vmstat 虚拟内存统计。 mpstat 显示各个可用CPU的状态统计。 iostat 统计系统的IO。 sar 全面地获取系统CPU、运行队列、磁盘读写、分页、内存、 CPU中断和网络性能数据。 ipcs 用于报告Linux中进程间通信设施的状态,显示信息包括消息列表、共享内存和信号量信息。 ipcrm 用来删除一个或更多的消息队列、信号量集或者共享内存标识。 strace 用于诊断、调试Linux用户空间跟踪器。我们用它来监控用户空间进程和内核交互,比如系统调用、信号传递、进程状态变更。 ltrace 命令会跟踪进程库函数调用,它会显现哪个库函数被调用。 shutdown 关机。 shutdown -h now 关闭系统 init 0 关闭系统 telinit 0 关闭系统 shutdown -h hours:minutes & 按预定时间关闭系统 shutdown -c 取消按预定时间关闭系统 shutdown -r now 重启 reboot 重启(2) logout 注销 halt 关机。 poweroff 关闭电源。 logout 退出当前登录的Shell。 exit 退出当前登录的Shell。 Ctrl+d 退出当前登录的Shell的快捷键。 进程管理相关命令(15个) bg 将一个后台暂停的命令,变成继续执行。 fg 将后台的命令调至前台继续运行。 jobs 查看当前有多少后台运行的命令。 kill 终止进程。 killall 通过进程名来终止进程。 pkill 通过进程名来终止进程。 crontab 定时任务命令。 ps 显示进程快照。 pstree 树形显示进程。 nice/renice 调整程序运行的优先级。 nohup 忽略挂起信号运行指定。 pgrep 查找匹配条件进程。 runlevel 查看系统当前运行级别。 init 切换运行级别。 service 启动、停止、重新启动、关闭系统服务,还可以显示所有系统服务的当前状态。

软件安装命令 1)RPM 包 - (Fedora, Redhat及类似系统) rpm -ivh package.rpm 安装一个rpm包 rpm -ivh --nodeeps package.rpm 安装一个rpm包而忽略依赖关系警告 rpm -U package.rpm 更新一个rpm包但不改变其配置文件 rpm -F package.rpm 更新一个确定已经安装的rpm包 rpm -e package_name.rpm 删除一个rpm包 rpm -qa 显示系统中所有已经安装的rpm包 rpm -qa | grep httpd 显示所有名称中包含 “httpd” 字样的rpm包 rpm -qi package_name 获取一个已安装包的特殊信息 rpm -qg “System Environment/Daemons” 显示一个组件的rpm包 rpm -ql package_name 显示一个已经安装的rpm包提供的文件列表 rpm -qc package_name 显示一个已经安装的rpm包提供的配置文件列表 rpm -q package_name --whatrequires 显示与一个rpm包存在依赖关系的列表 rpm -q package_name --whatprovides 显示一个rpm包所占的体积 rpm -q package_name --scripts 显示在安装/删除期间所执行的脚本l rpm -q package_name --changelog 显示一个rpm包的修改历史 rpm -qf /etc/httpd/conf/httpd.conf 确认所给的文件由哪个rpm包所提供 rpm -qp package.rpm -l 显示由一个尚未安装的rpm包提供的文件列表 rpm --import /media/cdrom/RPM-GPG-KEY 导入公钥数字证书 rpm --checksig package.rpm 确认一个rpm包的完整性 rpm -qa gpg-pubkey 确认已安装的所有rpm包的完整性 rpm -V package_name 检查文件尺寸、 许可、类型、所有者、群组、MD5检查以及最后修改时间 rpm -Va 检查系统中所有已安装的rpm包- 小心使用 rpm -Vp package.rpm 确认一个rpm包还未安装 rpm2cpio package.rpm | cpio --extract --make-directories bin 从一个rpm包运行可执行文件 rpm -ivh /usr/src/redhat/RPMS/arch/package.rpm 从一个rpm源码安装一个构建好的包 rpmbuild --rebuild package_name.src.rpm 从一个rpm源码构建一个 rpm 包

2)YUM 软件包升级器 - (Fedora, RedHat及类似系统) yum install package_name 下载并安装一个rpm包 yum localinstall package_name.rpm 将安装一个rpm包,使用你自己的软件仓库为你解决所有依赖关系 yum update package_name.rpm 更新当前系统中所有安装的rpm包 yum update package_name 更新一个rpm包 yum remove package_name 删除一个rpm包 yum list 列出当前系统中安装的所有包 yum search package_name 在rpm仓库中搜寻软件包 yum clean packages 清理rpm缓存删除下载的包 yum clean headers 删除所有头文件 yum clean all 删除所有缓存的包和头文件

3)DEB 包 (Debian, Ubuntu 以及类似系统) dpkg -i package.deb 安装/更新一个 deb 包 dpkg -r package_name 从系统删除一个 deb 包 dpkg -l 显示系统中所有已经安装的 deb 包 dpkg -l | grep httpd 显示所有名称中包含 “httpd” 字样的deb包 dpkg -s package_name 获得已经安装在系统中一个特殊包的信息 dpkg -L package_name 显示系统中已经安装的一个deb包所提供的文件列表 dpkg --contents package.deb 显示尚未安装的一个包所提供的文件列表 dpkg -S /bin/ping 确认所给的文件由哪个deb包提供

4)APT 软件工具 (Debian, Ubuntu 以及类似系统) apt-get install package_name 安装/更新一个 deb 包 apt-cdrom install package_name 从光盘安装/更新一个 deb 包 apt-get update 升级列表中的软件包 apt-get upgrade 升级所有已安装的软件 apt-get remove package_name 从系统删除一个deb包 apt-get check 确认依赖的软件仓库正确 apt-get clean 从下载的软件包中清理缓存 apt-cache search searched-package 返回包含所要搜索字符串的软件包名称

10、四剑客及高级(grep,sed,awk,cut,管道,xargs) 10.1 cut:以分隔符截取列(分段) 说明:cut命令用于读取文件的每一行按分隔符获取指定字节、字符和字段数并将这些字节、字符和字段写至标准输出。我们把cutm命令,可简单认为是对行数据的处理。官方释义:remove sections from each line of files(截取每行分段);如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。

语法:

cut OPTION... [FILE]... cut [-bn] [file] cut [-c] [file] cut [-df] [file] 1 2 3 4 参数:

-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。 -c :以字符为单位进行分割。 -d :自定义分隔符,默认为制表符(TAB)。 -f :与-d一起使用,指定显示哪个区域,即指定哪一个字段进行提取。。 -n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的范围之内,该字符将被写出;否则,该字符将被排除

eg1:cut截取以:分割保留第七段:grep hadoop /etc/passwd | cut -d: -f7 //分隔符也可以单引号引起

eg2:使用分隔符:打印/etc/passwd文件中每一行的第一个字段 cut -d ‘:’ -f 1 /etc/passwd

eg3:grep ‘/bin/bash’ /etc/passwd| cut -d ‘:’ -f 1,6 //从/etc/passwd文件提取第一和第六个字段

eg4:grep ‘/bin/bash’ /etc/passwd|cut -d ‘:’ -f 1-4,6,7 //取1-4连续字段的范围,指定以-分隔的开始字段和结束字段即可;

eg5:grep ‘/bin/bash’ /etc/passwd|cut -d ‘:’ --complement -f 2 //–complement用于排除/etc/passwd文件中的第二个字段

eg6:cut -d ‘:’ -f1,7 --output-delimiter=’ ’ /etc/passwd|sort //–output-delimiter=’ '用于指定输出的分隔符,默认输出的为cut处理时的指定分隔符

注:cut命令一个限制是它不支持指定多个字符作为分隔符。多个空格被视为多个字段分隔符,必须使用tr命令才能得到所需的输出。

10.2 grep查询表达式匹配到的字符或字符串 grep -v hadoop /etc/passwd ##查询不包含hadoop的行 grep ‘hadoop’ /etc/passwd ##一般用单引号,如果内部有转移字符的话且想保留转移字符的意义,这时用双引号;单引号屏蔽特殊字符的意义。

grep 'h.p' /etc/passwd 正则表达(点代表任意一个字符) grep '^hadoop' /etc/passwd 正则表达以hadoop开头 grep 'hadoop' /etc/passwd 以hadoop结尾 grep -v '^#' a.txt | grep -v '^' 查找不是以#开头的行 grep '^[hr]'/etc/passwd 以h或r开头的 grep '^[^hr]' /etc/passwd 不是以h和r开头的 grep '^[^h-r]' /etc/passwd 不是以h到r开头的 grep [0-9] /var/log/messages 选择 '/var/log/messages' 文件中所有包含数字的行 grep Aug -R /var/log/ 在目录 '/var/log' 及随后的目录中搜索字符串"Aug" 1 2 3 4 5 6 7 8 9 规则:

. : 任意一个字符

a* : 任意多个a(零个或多个a)

a? : 零个或一个a

a+ : 一个或多个a

.* : 任意多个任意字符

. : 转义.

o{2} : o重复两次

10.3 awk 文本分析工具 awk对文件进行逐行读入,默认以空格为分隔符将每行切片,切开的部分再进行各种分析处理,即awk会对文本依次对每一行进行处理,然后输出。 awk是行处理器,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息。

awk的用法:

awk 参数 ’ BEGIN{} // {action1;action2} ’ END{} 文件名 //-F 指定分隔符;-f 调用脚本,-v 定义变量,awk的格式中,-F后紧跟单引号,然后里面可自定义输出分隔符,print的动作要用 { } 括起来,否则会报错。print还可以打印自定义的内容,但是自定义的内容要用“”双引号括起来。

Begin{}: //初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符 /匹配内容/: // 匹配代码块,可以是字符串或正则表达式;'$1~/me/'中,~表示匹配的意思,获取第一个字段并匹配其后/ /内的关键字me;

{} : // 命令代码块,包含一条或多条命令,多条命令用 ; 隔开

END{} : //结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息 1 2 3 4 5 6 eg1: //统计 /etc/passwd 文件中包含root行的总数 #awk ‘BEGIN{X=0}/root/{X+=1}END{print “I find”,X,“root lines”}’ /etc/passwd

eg2:显示 /etc/passwd 中含有 root 的行 awk ‘/root/’ /etc/passwd eg3:以 : 为分隔,显示/etc/passwd中每行的第1和第7个字段(可以理解为1和第7列) awk -F “:” ‘{print 1,1,7}’ /etc/passwd awk ‘BEGIN{FS=“:”}{print 1,1,7}’ /etc/passwd eg4:以 : 为分隔,显示/etc/passwd中含有 root 的行的第1和第7个字段 awk -F “:” ‘/root/ {print 1,1,7}’ /etc/passwd eg5:以 : 为分隔,显示/etc/passwd中以 root 开头行的第1和第7个字段 awk -F “:” ‘/^root/ {print 1,1,7}’ /etc/passwd eg6:以 : 为分隔,显示/etc/passwd中第3个字段大于999的行的第1和第7个字段

awk -F ":" '3>999{print 1,7}' /etc/passwd 类似的还有:awk -F: '3=="600"' passwd

这是awk匹配条件操作符的用法,用逻辑符号判断的,比如 ‘==' 就是等于,也可以理解为 ‘精确匹配' 另外也有 >, ‘>=, ‘<, ‘<=, ‘!= 等等,值得注意的是,在和数字比较时,若把比较的数字用双引号引起来后,那么awk不会认为是数字,而认为是字符,加单引号和不加则认为是数字。还可以使用 && “并且”和 || “或者” 的意思。 awk -F: '3>3>4 && 7=="/bin/bash"passwd12345eg7::为分隔,显示/etc/passwd中第7个字段包含bash的行的第1和第7个字段awkF:”‘7=="/bin/bash"' passwd 1 2 3 4 5 eg7:以 : 为分隔,显示/etc/passwd中第7个字段包含bash的行的第1和第7个字段 awk -F “:” ‘7 ~ “bash” {print 1,1,7}’ /etc/passwd eg8:以 : 为分隔,显示/etc/passwd中第7个字段不包含bash的行的第1和第7个字段 awk -F “:” ‘7!~“nologin”{print 1,7}’ /etc/passwd eg9:以 : 为分隔,显示3>999并且第7个字段包含bash的行的第1和第7个字段,非系统用户的异常登录权限 awk -F “:” ‘3>999&&7~“bash”{print 1,1,7}’ /etc/passwd eg10:以 : 为分隔,显示3>999或第7个字段包含bash的行的第1和第7个字段awkF:”‘3>999或第7个字段包含bash的行的第1和第7个字段 awk -F “:” ‘3>999||7~“bash”{print 1,7}’ /etc/passwd eg11:获取eth0网卡的ip和掩码 ifconfig eth0|awk -F “[ :]+” ‘NR==2{print 4 “/” $NF}’ //[ :]+这个是正则表达式,+表示一个或多个,这里就表示一个或多个空格或冒号;

eg12:awk -F: ‘/root/ {print 1,1,3} /user/ {print 1,1,3}’ passwd //多次匹配,本例中全文匹配包含root关键词的行,再匹配包含user的行,打印所匹配的第1、3段。

【字符含义】:

0表示整个当前行0 表示整个当前行 1 每行第一个字段 NF 字段数量,用分隔符分隔后一共有多少段 NR 行数,每行的记录号,多文件记录递增,{print NR":"NF}列出行号,以冒号分隔,列出共有多少段; FNR 与NR类似,不过多文件记录不递增,每个文件都从1开始 \t 制表符 \n 换行符 FS BEGIN时定义分隔符,内建变量FS保存输入域分隔符的值,默认是空格或tab。我们可以通过-F命令行选项修改FS的值。如awk -F: '{print1,5}' test将打印以冒号为分隔符的第一,第五列的内容。可以同时使用多个域分隔符,这时应该把分隔符写成放到方括号中,如awk -F'[ :\t]' '{print 1,1,3}' test,表示以空格、冒号和tab作为分隔符。 RS 输入的记录分隔符, 默认为换行符(即文本是按一行一行输入) ~ 包含 !~ 不包含 == 等于,必须全部相等,精确比较 != 不等于,精确比较 && 逻辑与 || 逻辑或 + 匹配时表示1个或1个以上 /[0-9][0-9]+/ 两个或两个以上数字 /[0-9][0-9]*/ 一个或一个以上数字 OFS 自定义输出字段分隔符, 默认也是空格,可以改为其他的,'OFS="#"{print 3,3,4}',分隔符需要用双引号括起来 ORS 输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕 -F [:#/] 定义了三个分隔符 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 【print 打印】:print 是 awk打印指定内容的主要命令,也可以用 printf

awk ‘{print}’ /etc/passwd 等效于 awk ‘{print 0}’ /etc/passwd awk ‘{print " "}’ /etc/passwd 不输出passwd的内容,而是输出相同个数的空行,进一步解释了awk是一行一行处理文本 awk ‘{print “a”}’ /etc/passwd //输出相同个数的a行,一行只有一个a字母 awk -F: ‘{print 1}’ /etc/passwd 等效于 awk -F “:” ‘{print 1}’ /etc/passwd awk -F: ‘{print 1 2}’ //输入字段1,2,中间不分隔 awk -F: ‘{print 1,3,3,6}’ OFS=“\t” /etc/passwd 输出字段1,3,6, 以制表符作为输出分隔符 awk -F: ‘{print 1;print1; print 2}’ /etc/passwd 输入字段1,2,分行输出 awk -F: ‘{print 11 “**” 2}’ /etc/passwd 输入字段1,2,中间以**分隔 awk -F: ‘{print “name:”1"\tid:"1"\tid:"3}’ /etc/passwd 自定义格式输出字段1,2

awk -F: ‘{print NF}’ /etc/passwd 显示每行有多少字段(多少个分段/多少列) awk -F: ‘NF>2{print }’ /etc/passwd 将每行字段数大于2的打印出来 awk -F: ‘NR==5{print}’ /etc/passwd 打印出/etc/passwd文件中的第5行 awk -F: ‘NR==5|NR==6{print}’ /etc/passwd 打印出/etc/passwd文件中的第5行和第6行 awk -F: ‘NR!=1{print}’ /etc/passwd 不显示第一行 awk -F: ‘{print > “1.txt”}’ /etc/passwd 输出到文件中 awk -F: ‘{print}’ /etc/passwd > 2.txt 使用重定向输出到文件中

【字符匹配】:

awk -F: '/root/{print }' /etc/passwd 打印出文件中含有root的行 awk -F: '/'A/print/etc/passwd打印出文件中含有变量A'/{print }' /etc/passwd 打印出文件中含有变量 A的行 awk -F: '!/root/{print}' /etc/passwd 打印出文件中不含有root的行 awk -F: '/root|tom/{print}' /etc/passwd 打印出文件中含有root或者tom的行 awk -F: '/mail/,mysql/{print}' test 打印出文件中含有 mail*mysql 的行,代表有0个或任意多个字符 awk -F: '/^[2][7][7]/{print}' test 打印出文件中以27开头的行,如27,277,27gff 等等 awk -F: '1 /root/print/etc/passwd打印出文件中第一个字段是root的行awkF:(1~/root/{print}' /etc/passwd 打印出文件中第一个字段是root的行 awk -F: '(1=="root"){print}' /etc/passwd 打印出文件中第一个字段是root的行,与上面的等效 awk -F: '1! /root/print/etc/passwd打印出文件中第一个字段不是root的行awkF:(1!~/root/{print}' /etc/passwd 打印出文件中第一个字段不是root的行 awk -F: '(1!="root"){print}' /etc/passwd 打印出文件中第一个字段不是root的行,与上面的等效 awk -F: '1 /rootftp/print/etc/passwd打印出文件中第一个字段是rootftp的行awkF:(1~/root|ftp/{print}' /etc/passwd 打印出文件中第一个字段是root或ftp的行 awk -F: '(1=="root"||1=="ftp")print/etc/passwd打印出文件中第一个字段是rootftp的行,与上面的等效awkF:1=="ftp"){print}' /etc/passwd 打印出文件中第一个字段是root或ftp的行,与上面的等效 awk -F: '1!~/root|ftp/{print}' /etc/passwd 打印出文件中第一个字段不是root或不是ftp的行 awk -F: '(1!="root"1!="root"||1!="ftp"){print}' /etc/passwd 打印出文件中第一个字段不是root或不是ftp的行,与上面等效 awk -F: '{if(1~/mail/) {print 1} else {print 2}}' /etc/passwd 如果第一个字段是mail,则打印第一个字段,否则打印第2个字段 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 awk '/\1|$6/{print 1}' /etc/shadow awk '/\6/{print $1}' /etc/shadow

上述两条命令等效,其中正则表达式'/$1|$6/{print 1}'表示使用匹配模式'/匹配模式/',|表可以匹配多个规则,抓取1或6字符的行,6字符的行,0它表示整行,n表第n个字段,因打印分段默认分隔符为空格,所以n表第n个字段,因打印分段默认分隔符为空格,所以1就相当于整行了,关于口令特性如下: 星号代表帐号被锁定,将无法登录;双叹号表示这个密码已经过期了, 如果是xxxxxxxxxx的形式,则代表密码正常。的形式,则代表密码正常。 6开头的,表明是用SHA512加密的,密文长度86,示例中‘5NAhdLZN’为salt值,是一个随机字符串,供加密使用开头的,表明是用SHA-512加密的,密文长度86,示例中‘5NAhdLZN’为salt值,是一个随机字符串,供加密使用 1表明是用MD5加密的,密文长度22个字符表明是用MD5加密的,密文长度22个字符 2是用Blowfish加密的,是用Blowfish加密的, 5$ 是用 SHA-256加密的,密文长度43

1 2 3 4 5 6 7 8 9 10 格式化输出 awk ‘{printf “%-5s %.2d”,1,1,2}’ test

printf 表示格式输出 %格式化输出分隔符 -8表示长度为8个字符 s表示字符串类型,d表示小数

10.4 sed:流编辑器 sed把当前处理的行存储在一个称为“模式空间”(pattern space)的临时缓冲区中。 sed 处理数据之前,需要预先提供一组规则,sed 会按照此规则来编辑数据。此命令的关键在于掌握各式各样的脚本命令及模式匹配;sed模式是匹配行,而非对应的字符串,操作时对匹配航的匹配字符串,模式中y可进行字符替换,它会对单个字符一一映射匹配替换。

【语法】: 1)sed的命令格式:sed [options] ‘command’ file(s); //默认直接在命令行模式上进行sed动作编辑

2)sed的脚本格式:sed [options] -f scriptfile file(s); //-f选项,将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作;

注意:对于/pattern/command,必须用正斜线将要指定的 pattern 封起来,sed 会将该命令作用到包含指定文本模式的行上。 命令执行数据的顺序如下:

1>每次仅读取一行内容; 2>根据提供的规则命令匹配并修改数据。注意, sed 默认不会直接修改源文件数据,而是会将数据复制到缓冲区中,修改也仅限于缓冲区中的数据; 3>将执行结果输出。 当一行数据匹配完成后,它会继续读取下一行数据,并重复这个过程,直到将文件中所有数据处理完毕。

【选项】: -i :直接修改文件内容; -n :只打印模式匹配的行;默认情况下,sed 会在所有的脚本指定执行完毕后,会自动输出处理后的内容,而该选项会屏蔽启动输出,需使用 print 命令来完成输出。 -r :支持扩展表达式; -e 脚本命令: 该选项会将其后跟的脚本命令添加到已有的命令中 -f 脚本命令文件: 该选项会将其后文件中的脚本命令添加到已有的命令中

【模式参数】: a(或 i)+\新文本内容: 在当前行下面插入文本; i\ +要插入的新文本 : 在当前行上面插入文本; c+用于替换的新文本: 把选定的行改为新的文本; y/inchars/outchars/:转换命令会对 inchars 和 outchars 值进行一对一的映射,即 inchars 中的第一个字符会被转换为 outchars 中的第一个字符,第二个字符会被转换成 outchars 中的第二个字符…这个映射过程会一直持续到处理完指定字符。如果 inchars 和 outchars 的长度不同,则 sed 会产生一条错误消息。 d 删除,删除选择的行; D 删除模板块的第一行; s 替换指定字符; h 拷贝模板块的内容到内存中的缓冲区; H 追加模板块的内容到内存中的缓冲区; g 获得内存缓冲区的内容,并替代当前模板块中的文本; G 获得内存缓冲区的内容,并追加到当前模板块文本的后面; l 列表不能打印字符的清单; n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令; N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码; p 打印模板块的行,即搜索符号条件的行,并输出该行的内容。 P(大写) 打印模板块的第一行; q 退出Sed; b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾; r file 从file中读行; t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾; T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾; w file 写并追加模板块到file末尾; W file 写并追加模板块的第一行到file末尾; ! 表示后面的命令对所有没有被选定的行发生作用; = 打印当前行号;

把注释扩展到下一个换行符以前;

【文本替换参数】: g 表示行内全面替换;

p 表示打印行;

w 表示把行写入一个文件;

x 表示互换模板块中的文本和缓冲区中的文本;

y 表示把一个字符翻译为另外的字符(但是不用于正则表达式);

\1 子串匹配标记;

& 已匹配字符串标记;

【文本匹配】:

^ 匹配行开始,如:/^sed/匹配所有以sed开头的行;

匹配行结束,如:/sed 匹配行结束,如:/sed/匹配所有以sed结尾的行;

. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d;

匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行; [] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed;

[^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行;

(…) 匹配子串,保存匹配的字符,如s/(love)able/\1rs,loveable被替换成lovers;

& 保存搜索字符用来替换其他字符,如s/love/&/,love这成love;

< 匹配单词的开始,如:/\

匹配单词的结束,如/love>/匹配包含以love结尾的单词的行;

x{m} 重复字符x,m次,如:/0{5}/匹配包含5个0的行;

x{m,} 重复字符x,至少m次,如:/0{5,}/匹配至少有5个0的行;

x{m,n} 重复字符x,至少m次,不多于n次,如:/0{5,10}/匹配5~10个0的行;

命令示例:

测试文件:#cat sed.txt date schooL teaCher tea Car red Hell0 Centos liNux

1)sed ‘s/date/Date/’ sed.txt

2)sed -n ‘s/date/Date/p’ sed.txt //-n 选项会禁止 sed 输出,但 p 标记会输出修改过的行,-n选项和p命令一起使用表示只打印那些发生替换的行:

3)sed ‘s/date/Date/2’ sed.txt //使用数字 2 作为标记的结果就是,sed 编辑器只替换每行中第 2 次出现的匹配模式

sed ‘s/date/Date/w test.txt’ sed.txt //w 标记会将匹配后的结果保存到指定文件中

sed ‘3d’ sed.txt //删除 sed.txt 文件内容中的第 3 行,如果不指定删除行,sed文件内容将全部删除,请慎重

6)sed ‘2,3d’ sed.txt //删除 sed.txt 文件内容中的第 2、3行

7)sed ‘/1/,/3/d’ sed.txt //删除第 1~3 行的文本数据,用两个文本模式来删除某个区间内的行,要小心指定的第一个模式会“打开”行删除功能,第二个模式会“关闭”行删除功能,因此,sed 会删除两个指定行之间的所有行(包括指定的行)

8)sed ‘3,$d’ sed.txt //删除 sed.txt 文件内容中第 3 行开始的所有的内容,默认情况下 sed 并不会修改原始文件,这里被删除的行只是从 sed 的输出中消失了,原始文件没做任何改变。

9)sed ‘3i\This is an inserted line.’ sed.txt //将一个新行插入到数据流第三行前,将i改为a,就表示将一个新行附加到数据流中第三行后

10)将一个多行数据添加到数据流中,只需对要插入或附加的文本中的每一行末尾(除最后一行)添加反斜线即可: sed '1i\

This is one line of new text. This is another line of new text.’ sed.txt ##//第1行前插入2行

11)sed ‘3c\This is a changed line of text.’ sed.txt //sed 编辑器会修改第三行中的文本,将第2行修改/替换为新内容

12)echo “This 1 is a test of 1 try.” | sed ‘y/123/456/’ //输出如下,因y字符替换是全局命令,它会文本行中找到的所有指定字符自动进行转换,而不会考虑它们出现的位置,无法限定只转换在特定地方出现的字符 This 4 is a test of 4 try.

13) sed -n ‘/number 3/p’ sed.txt //用 -n 选项和 p 命令配合使用,我们可以禁止输出其他行,只打印包含匹配文本模式的行,用于只查看特定行的内容

14)如需要在修改之前查确认该行,可以使用打印命令,与替换或修改命令一起使用,sed 命令会查找包含数字 3 的行,然后执行两条命令。首先,脚本用 p 命令来打印出原始行;然后它用 s 命令替换文本,并用 p 标记打印出替换结果。输出同时显示了原来的行文本和新的行文本。

sed -n '/3/{

p s/line/test/p }' data6.txt This is line number 3. This is test number 3. 1 2 3 4 5 6 15)r 命令用于将一个独立文件的数据插入到当前数据流的指定位置

[root@localhost ~]# cat data12.txt This is an added line. This is the second added line. [root@localhost ~]# sed '3r data12.txt' data6.txt This is line number 1. This is line number 2. This is line number 3. This is an added line. This is the second added line. This is line number 4. 1 2 3 4 5 6 7 8 9 10 将指定文件中的数据插入到数据流的末尾,可以使用 $ 地址符:

sed '$r data12.txt' data6.txt This is line number 1. This is line number 2. This is line number 3. This is line number 4. This is an added line. This is the second added line. 1 2 3 4 5 6 7 16)sed ‘/number 1/{ s/number 1/number 0/;q; }’ test.txt //sed 命令会在匹配到 number 1 时,将其替换成 number 0,然后直接退出

17)默认情况下,sed 命令会作用于文本数据的所有行。如果只想将命令作用于特定行或某些行,则必须写明 address 部分,表示的方法有以下 2 种: a、以数字形式指定行区间;

eg1:sed ‘2s/dog/cat/’ data1.txt //sed 只修改地址指定的第二行的文本 eg2:sed ‘2,3s/dog/cat/’ data1.txt //修改指定的第二行到第三行包括2者的文本 eg3:sed ‘2,$s/dog/cat/’ data1.txt //修改文本中从某行开始的所有行

b、用文本模式指定具体行区间。

[address]脚本命令

或者

address { 多个脚本命令 } //上例中的/number 1/就是指定了匹配的address 1 2 3 4 5 6 7 18)用文本模式指定行区间:/pattern/command;必须用正斜线将要指定的 pattern 封起来,sed 会将该命令作用到包含指定文本模式的行上

eg1:sed ‘/demo/s/bash/csh/’ /etc/passwd //只修改用户 demo 的默认 shell

在文本模式使用正则表达式指明作用的具体行。正则表达式允许创建高级文本模式匹配表达式来匹配各种数据。这些表达式结合了一系列通配符、特殊字符以及固定文本字符来生成能够匹配几乎任何形式文本的简练模式。

19)其他用法: sed ‘/^KaTeX parse error: Expected 'EOF', got '#' at position 48: …除所有空白行 sed '/ *#̲/d; /^/d’ example.txt 从example.txt文件中删除所有注释和空白行 echo ‘esempio’ | tr ‘[:lower:]’ ‘[:upper:]’ 合并上下单元格内容 sed -e ‘1d’ result.txt 从文件example.txt 中排除第一行 sed -n ‘/stringa1/p’ 查看只包含词汇 “string1"的行 sed -e ‘s/ //’ example.txt 删除每一行最后的空白字符 sed -e ‘s/stringa1//g’ example.txt 从文档中只删除词汇 “string1” 并保留剩余全部 sed -n ‘1,5p;5q’ example.txt 查看从第一行到第5行内容 sed -n ‘5p;5q’ example.txt 查看第5行 sed -e 's/00/0/g’ example.txt 用单个零替换多个零 cat -n file1 标示文件的行数 cat example.txt | awk ‘NR%2==1’ 删除example.txt文件中的所有偶数行 echo a b c | awk ‘{print 1}’ 查看一行第一栏 echo a b c | awk ‘{print 1,1,3}’ 查看一行的第一和第三栏 paste file1 file2 合并两个文件或两栏的内容 paste -d ‘+’ file1 file2 合并两个文件或两栏的内容,中间用”+"区分 sort file1 file2 排序两个文件的内容 sort file1 file2 | uniq 取出两个文件的并集(重复的行只保留一份) sort file1 file2 | uniq -u 删除交集,留下其他的行 sort file1 file2 | uniq -d 取出两个文件的交集(只留下同时存在于两个文件中的文件) comm -1 file1 file2 比较两个文件的内容只删除 ‘file1’ 所包含的内容 comm -2 file1 file2 比较两个文件的内容只删除 ‘file2’ 所包含的内容 comm -3 file1 file2 比较两个文件的内容只删除两个文件共有的部分

20)特殊用法:

10.5 、tr(Translate替换/转译)命令 用于替换/转化(大小写转化)、压缩重复和/或删除标准输入中的字符,写入标准输出。在没有任何参数选项时,默认是替换,与加上-s参数选项结果是一致的。

语法:tr [OPTION]…SET1[SET2] 参数:

-c, --complement:反选设定字符。也就是符合 SET1 的部份不做处理,不符合的剩余部份才进行转换 -d, --delete:删除指令字符 -s, --squeeze-repeats:缩减连续重复的字符成指定的单个字符 -t, --truncate-set1:削减 SET1 指定范围,使之与 SET2 设定长度相等 –help:显示程序用法信息 –version:显示程序本身的版本信息