300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > linux基础(四):shell简单命令;文件系统命令 系统操作命令 文本操作命令;文本处理命令

linux基础(四):shell简单命令;文件系统命令 系统操作命令 文本操作命令;文本处理命令

时间:2023-11-14 06:12:49

相关推荐

linux基础(四):shell简单命令;文件系统命令 系统操作命令 文本操作命令;文本处理命令

目录

一、shell简单命令1.1命令入门1.1.1命令提示符详解1.1.2命令格式1.2 获取命令的帮助1.2.1 help1.2.2 命令 --help1.2.3 查手册&搜索引擎1.3 man1.3.1 man安装1.3.2 man的使用1.4 常见命令1.4.0 whereis 、ps、管道1.4.1 echo1.4.2 test命令1.4.3 环境变量:PATH1.4.4 type和file1.4.5 其他简单命令二、文件系统命令、系统操作命令、文本操作命令2.1 文件系统命令2.2 系统操作命令2.3 文本操作命令三、文本处理3.0 linux中的正则表达式3.0.1 匹配符:3.0.2 重复操作符:3.1 cut:显示切割的行数据3.2 sort:排序文件的行3.3 wc:统计文本信息(行数,单词个数,字符个数)3.4 sed:行编辑器sed [options] 'AddressCommand' file ...AddressCommand3.5 awk:强大的文本分析工具3.5.1 -F 自定义分隔符3.5.2 支持函数3.5.3 支持流程控制语句,类C语言3.5.4 举例

一、shell简单命令

1.1命令入门

1.1.1命令提示符详解

[root@localhost ~]# /root

[jinxf@localhost ~]$ /home/jinxf

用户名@主机名 当前目录 #系统权限 $普通权限

1.1.2命令格式

命令选项 参数 (三者之间要有空格,区分大小写)command [-options] [args][args]:参数(多个参数之间用空格分隔)案例演示[root@node1 ~]# ls -a

1.2 获取命令的帮助

1、使用help查看内建命令的帮助(enable查看内建命令)

2、info 命令

3、!!! 命令 --help

4、!!!#man 命令

5、!!!查手册

6、搜索引擎

1.2.1 help

[root@node1 ~]# help -s cdcd: cd [-L|-P] [dir][root@node1 ~]# help -d cdcd - Change the shell working directory.[root@node1 ~]# help -m cdNAMEcd - Change the shell working directory.SYNOPSIScd [-L|-P] [dir]DESCRIPTIONChange the shell working directory.Change the current directory to DIR. The default DIR is the value of theHOME shell variable.

但是help只能查看内建命令,比如我想查看mv的帮助信息就不行

[root@node1 ~]# help mvbash: help: no help topics match `mv'. Try `help help' or `man -k mv' or `info mv'.

那么我们怎么知道哪些是内建命令呢?

[root@node1 ~]# enableenable也不用背,该方式比较费时间,help无法使用时,根据提示换其他帮助方式就ok了。

1.2.2 命令 --help

[root@node1 ~]# mv --help

1.2.3 查手册&搜索引擎

手册见《参考手册&资料》

搜索:必应

谷歌/百度等

1.3 man

1.3.1 man安装

当前虚拟机中不能直接使用man,默认是没有安装的,不识别man命令。[root@node2 ~]# man ls-bash: man: command not found所以需要安装,安装man和man-pages手册,查看命令的帮助信息[root@node1 ~]# yum install man man-pages -y[root@node1 ~]# man lsq退出命令查看看到的全是英文,是不是很酸爽,慢慢多看看就好了。如果你英语烂到完全看不懂,那我再教你一招,汉化man提示信息。要想汉化man提示信息,系统中需要安装man-pages-zh-CN软件包。默认情况下,系统自带的yum源不包含man-pages-zh-CN。[root@node2 ~]# yum search man-pages-zh-CNLoaded plugins: fastestmirrorLoading mirror speeds from cached hostfile* base: * extras: mirror.* updates: mirror.Warning: No matches found for: man-pages-zh-CNNo Matches found默认的源存放目录:[root@node2 ~]# ls /etc/yum.repos.d/CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo所以下载后的第三方yum源epel也保存到该目录下,使用yum命令时会去该目录下解析后缀名为repo的文件。[root@node1 ~]# wget -O /etc/yum.repos.d/epel.repo /repo/epel-6.repo-bash: wget: command not foundwget不能使用,需要先安装,安装wget,否则无法通过该命令进行下载。[root@node1 ~]# yum install wget -y然后将epel的源放到本地,然后清除yum本地缓存,重新生成缓存。[root@node1 ~]#wget -O /etc/yum.repos.d/epel.repo /repo/epel-6.repo[root@node1 ~]# yum clean all[root@node1 ~]#yum makecache[root@node1 ~]# yum install man-pages-zh-CN -y是不是可以使用了呢,相信你已经迫不及待的想要测试一把了。[root@node1 ~]# man ls发现还是英文,怎么回事?这是因为虽然你安装了man的中文包,但是系统的语言还是英文环境, [root@node1 ~]# echo $LANGen_US.UTF-8所以需要修改系统的语言环境。[root@node1 ~]# LANG=zh_CN.UTF-8[root@node1 ~]# echo $LANGzh_CN.UTF-8然后再次测试便有中文信息了。但是这样修改这有效到断开连接,或者下次重启系统。如何才能长期有效呢?[root@node1 ~]# vim /etc/sysconfig/i18n

1.3.2 man的使用

enter向下一行空格按页向下翻 b向上翻页p直接翻到首页查找按 /要查找的内容,查找 下一个/上一个:按n/N;退出按qman-1用户命令(/bin,/usr/bin,/usr/local/bin)-2系统调用-3库函数-4特殊文件(设备文件)-5文件格式(配置文件的语法)-6游戏-7杂项(Miscellaneous)-8管理命令(/sbin,/usr/sbin,/usr/local/sbin)指定查看某种帮助:[root@node1 ~]# man 2 read[root@node1 ~]# man read

1.4 常见命令

1.4.0 whereis 、ps、管道

whereis : 定位命令位置ps -fe 进程列表 cat b.txt | head -3| tail -1 shell读取用户输入的字符串发现 |,代表有管道,| 左右被理解为简单命令加工:前一个(左边)简单命令的标准输出指向后一个(右边)简单命令的标准输入注意:后一个简单命令一定能够接受标准输入xargs:1,在标准输入中读取到的内容!2,自己的参数理解为一个字符串模仿shell,做blank切分,第一个子字符串为命令3,将步骤1的内容做为步骤2的命令的选项参数拼接起来4,执行得到的结果echo "/" |xargs ls -l

1.4.1 echo

[root@node1 ~]# help echoecho -n表示不要另起新行[root@node1 ~]# echo "hello world"hello world[root@node1 ~]# echo -n "hello world"hello world[root@node1 ~]#-e表示解释逃逸字符[root@node1 ~]# echo -e "hello \nworld"hello world[root@node1 ~]# echo "hello \nworld"hello \nworld

1.4.2 test命令

计算3 > 2的结果,打印返回值,计算3 < 2的结果,打印返回值。

echo $? 打印上一行命令的执行结果

[root@node1 ~]# test 3 -gt 2[root@node1 ~]# echo $?0[root@node1 ~]# test 3 -lt 2[root@node1 ~]# echo $?1[root@node1 ~]# test 5 -lt 2[root@node1 ~]# echo $?1成立返回0(true),不成立返回1(false)[root@node1 ~]# [ 3 -gt 2 ][root@node1 ~]# echo $?0[root@node1 ~]# [ 5 -lt 2 ][root@node1 ~]# echo $?1[root@node1 ~]# [ 5 -lt 2]-bash: [: missing `]'[root@node1 ~]# [5 -lt 2 ]-bash: [5: command not found[]和内容之间一定要有空格,否则抛错。

1.4.3 环境变量:PATH

当在shell中执行命令的时候,默认到PATH指定的路径中查找可执行文件。

如果在PATH中的多个目录都包含该可执行文件,则执行最先找到的。

[root@node1 ~]# echo $PATH/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

如果找不到,这提示命令不识别。

1.4.4 type和file

type命令:外部命令和内部命令

type打印一个字符串的类型,可能的值为:别名,内置命令,函数,关键字,可执行文件或者什么都不输出(不是前面的类型)。

操作系统:kernel内核+shell壳

查看cd命令的类型:

[root@node1 ~]# type cdcd is a shell builtincd是一个builtin命令,也就是bash内置的命令。查看yum命令的类型:[root@node1 ~]# type yumyum is /usr/bin/yumyum是外部命令file命令:检查文件的类型。[root@node1 ~]# file /usr/bin/yum/usr/bin/yum: a /usr/bin/python script text executableyum命令是外部命令,它的文件是python脚本类型文件。[root@node1 ~]# file /bin/ls/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, strippedls是二进制可执行文件(ELF)。

1.4.5 其他简单命令

lsls命令用于列出目录内容ls添加-l以长格式输出,列出根目录下内容的详细列表ls -l也可以后面跟多个目录,列出多个目录的内容ls / /usr也可以通过命令的别名列出详细列表llls -als -a -lls -alpwd打印当前工作目录路径cdcd用于更改shell工作目录,也就是切换目录 change directory cdcd /etc如果cd后什么都不写,表示直接回当前用户家目录cd cd /etccd后跟波浪线,也表示回用户家目录cd ~cd后也可以跟减号(-)用以表示回到最后一次切换之前的目录,多次使用减号在最近两个目录之间切换cd /etc/sysconfig/network-scritpscd -root用户可以直接通过绝对路径进到普通用户的家目录cd /home/godcd ..ll也可以直接跟波浪线用户名表示直接进入到某个用户的家目录cd ~bjsxt 到用户bjsxt家中去,root不受限制ps可以通过命令查看系统内进程信息ps -ef查看磁盘使用情况进程查看命令ps(process status) :将某个时间点的程序运作情况截取下来 选项和参数 -a :和输入终端(terminal) 关联的所有 process,通常与x一起使用,列出完整信息。-x :后台进程,通常与 a 这个参数一起使用,可列出较完整信息-u :有效使用者 (effective user) 相关的 process 常用组合 ps aux 观察系统所有的程序数据 (常用)[root@node1 /]# ps aux[root@node1 /]# ps au•以下为各选项的含义USER:该 process 属于那个使用者PID :该 process 的程序标识符。 %CPU:该 process 使用掉的 CPU 资源百分比; %MEM:该 process 所占用的物理内存百分比; VSZ :该 process 使用掉的虚拟内存量 (Kbytes) RSS :该 process 占用的物理的内存量 (Kbytes) TTY :该 process 是在那个终端机上面运作,若与终端机无关则显示 ?, 另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。 STAT:该进程目前的状态,状态显示与ps -l 的 S 旗标相同 (R/S/D/T/Z) START:该 process 被触发启动的时间; TIME :该 process 实际使用 CPU 运作的时间。 COMMAND:该程序的实际命令为何? 进入到/usr目录;usr不是用户的意思,而是unix software resources的简写cd /usr查看内容llmkdirmkdir用于创建目录mkdir abcmkdir a1 a2 a3如果直接创建多层目录,则报错,因为默认只能创建最后一级目录mkdir a/b/c可以添加-p选项,用以创建多层目录,因为系统发现某一级目录不存在的时候创建父目录mkdir -p a/b/c也可以在mkdir后跟多个目录,用于一次性创建多个目录mkdir ./abc/1dir ./abc/2dir ./abc/3dir但是可以使用大括号高效创建相似的目录mkdir ./abc/{x,y,z}dir Mkdir ./abc/{x..z}dirrmrm用于删除文件直接删除,需要确认yesrm file[root@node1 abc]# lltotal 24drwxr-xr-x 2 root root 4096 Nov 27 10:17 1dir-rw-r--r-- 1 root root 0 Nov 27 10:18 1.logdrwxr-xr-x 2 root root 4096 Nov 27 10:17 2dirdrwxr-xr-x 2 root root 4096 Nov 27 10:17 3dirdrwxr-xr-x 2 root root 4096 Nov 27 10:18 xdirdrwxr-xr-x 2 root root 4096 Nov 27 10:18 ydirdrwxr-xr-x 2 root root 4096 Nov 27 10:18 zdir[root@node1 abc]# rm 1.log rm: remove regular empty file `1.log'? y[root@node1 abc]# lltotal 24drwxr-xr-x 2 root root 4096 Nov 27 10:17 1dirdrwxr-xr-x 2 root root 4096 Nov 27 10:17 2dirdrwxr-xr-x 2 root root 4096 Nov 27 10:17 3dirdrwxr-xr-x 2 root root 4096 Nov 27 10:18 xdirdrwxr-xr-x 2 root root 4096 Nov 27 10:18 ydirdrwxr-xr-x 2 root root 4096 Nov 27 10:18 zdir添加-f选项可以不用确认强制删除rm -f file如果rm的参数是目录,则会提示需要迭代删除而不能成功rm adir[root@node1 abc]# touch 2.log[root@node1 abc]# rm -f 2.log [root@node1 abc]# rm -f 1dirrm: cannot remove `1dir': Is a directory此时可以添加-r参数表示迭代删除rm -r dira也可以使用-rf选项,迭代强制删除某个文件或目录,此命令慎用。rm -rf dira尤其是!!!! rm -rf /cp•cp拷贝cp 文件… 目标目录拷贝文件…到目标目录,可以同时拷贝多个文件,文件名之间用空格隔开[root@node1 ~]# cp install.log anaconda-ks.cfg abc/[root@node1 ~]# ls abc/1dir 2dir 3dir anaconda-ks.cfg install.log xdir ydir zdir[root@node1 ~]# cd abc/xdir/[root@node1 xdir]# cp /root/install.log /root/abc/xdir/ 太啰嗦[root@node1 xdir]# cp ~/install.log .cp: overwrite `./install.log'? y[root@node1 xdir]#cp -r 目录 目标目录[root@node1 ~]# mkdir xyz[root@node1 ~]# lsa abc anaconda-ks.cfg install.log install.log.syslog xyz[root@node1 ~]# cp abc/ xyz/cp: omitting directory `abc/'[root@node1 ~]# cp -r abc/ xyz[root@node1 ~]# ls -R xyz/xyz/:abcxyz/abc:1dir 2dir 3dir anaconda-ks.cfg install.log xdir ydir zdirxyz/abc/1dir:xyz/abc/2dir:xyz/abc/3dir:xyz/abc/xdir:install.logxyz/abc/ydir:xyz/abc/zdir:mvmv用于移动或重命名文件•移动文件/目录 #mv 源文件/[源文件1 源文件2] 目标[root@node1 ~]# cd abc[root@node1 abc]# mkdir -p x/y/z[root@node1 abc]# mv install.log anaconda-ks.cfg x/y[root@node1 abc]# ls x/yanaconda-ks.cfg install.log z[root@node1 abc]# mv x /root[root@node1 abc]# ls -R /root/x/root/x:y/root/x/y:anaconda-ks.cfg install.log z/root/x/y/z:[root@node1 abc]#•Linux中没有专门改名的命令,兼职改名工作:[root@node1 abc]# ls1dir 2dir 3dir xdir ydir zdir[root@node1 abc]# mv zdir zzdir[root@node1 abc]# ls1dir 2dir 3dir xdir ydir zzdir[root@node1 abc]#

二、文件系统命令、系统操作命令、文本操作命令

2.1 文件系统命令

虚拟目录树!!!df查看系统挂载的磁盘情况df以人能看懂的格式显示df -h列出根目录下的内容ls /进到boot目录cd /boot在linux中用到了虚拟目录树它的存在就是为了解耦应用和底层存储mount将光驱挂载到/mnt目录:mount /dev/cdrom /mnt进入到/mnt目录cd /mnt查看磁盘分区的挂载情况:df -humount卸载掉挂载的分区/mntumount /mnt注意卸载/mnt时,当前目录不能在/mnt下面,否则报出如下图所示提示:再次查看磁盘分区的挂载情况:df -h重新挂载mount /dev/cdrom /mnt如果没有挂载,则访问父目录的文件夹再次查看df -h虚拟目录树的各个目录用途目录用途/虚拟目录的根目录。通常不会在这里存储文件/bin二进制目录,存放许多用户级的GNU工具/boot启动目录,存放启动文件/dev设备目录,Linux在这里创建设备节点/etc系统配置文件目录/home主目录,Linux在这里创建用户目录/lib库目录,存放系统和应用程序的库文件/media媒体目录,可移动媒体设备的常用挂载点/mnt挂载目录,另一个可移动媒体设备的常用挂载点/opt可选目录,常用于存放第三方软件包和数据文件/proc进程目录,存放现有硬件及当前继承的相关信息/rootroot用户的主目录/sbin系统二进制目录,存放许多GNU管理员级工具/srv服务目录,存放本地服务的相关文件/sys系统目录,存放系统硬件信息的相关文件/tmp临时目录,可以在该目录中创建和删除临时工作文件/usr大量用户级的GNU工具和数据文件都存储在这里/var可变目录,用以存放经常变化的文件,比如日志文件文件元数据

2.2 系统操作命令

du !!!du可以为目录递归地汇总每个FILE的磁盘使用情况。•du:文件系统的磁盘使用量或是目录使用量 ᅳa :列出所有的文件与目录容量 ᅳh :以人们较易读的容量格式(G/M)显示 重要ᅳs :列出总量而已,而不列出每个各别的目录占用容量ᅳk :以 KBytes 列出容量显示 ᅳm :以 MBytes 列出容量显示 cd /usrdu添加-s参数可以生成指定目录的汇总信息,也就是共占用多大的磁盘空间du -s ./添加-h参数可以显示为人类可以读懂的格式du -sh ./将路径写成./*统计当前目录下每项内容占用的磁盘空间信息du -sh ./*查看/usr/local目录下共占用多大磁盘空间[root@node1 usr]# du -sh /usr/local132K/usr/localstat!显示文件的元数据stat /etc/profilechange和modify的不同modify指的是文件内容被修改的时间???change表示文件元数据被修改的时间touch!!touch 已存在的文件,抹平各个时间touch 不存在的文件,则创建文件

2.3 文本操作命令

直接查看一个文件的内容可以使用cat,tac,nl这几个指令cat(concatenate):cat是concatenate的缩写,其功能时间一个文件的内容连续的输出。该命令适合看行数较少的文件。另外,需要查看一般DOS文件时,可以通过-A选项来显示换行符和[tab]。tac(反向输出):与上面的cat命令进行比较,是由最后一行先显示。tac功能与cat类似,但是是由文件最后一行反向连续输出到屏幕上。nl(添加行号打印):nl可以将输出的文件内容自动的加上行号。more!!![root@node1 ~]# more /etc/man.configmore会在最后一行输出目前按显示内容的所占百分比,在现实过程中我们还可以输入以下命令进行进一步操作:空格(space):向下翻页回车(Enter):向下翻一行“/字符串”:在当前显示内容中线下查询字符串内容“:f”:立即显示出文件名以及目前显示的行数“q”:离开显示内容“b”或[ctrl]-b:代表回翻,该操作仅对文件有效less!!查看文件内容的时候可以进行一下操作:空格:向下翻一页[pagedown]:向下翻动一页[pageup]:向上翻动一页“/字符串”:向下搜索字符串内容“?字符串”:向上搜寻字符串内容n:重复上一次查询任务N:反向重复前一个查询任务g:到文件的第一行G:到文件的最后一行(注意大小写)q:离开文件head!!head(取出前面几行,Centos6.5使用/etc/man.config文件):tail!!!管道!!!|[root@bk1 ~]# ps -ef |grep ssh[root@bk1 ~]# yum list |grep mysql如何显示文件中间的几行?head -m profile | tail -n管道左侧的输出作为右侧的输入echo "/" | ls -l 显示内容错误(不是预期的结果),因为ls不需要输入,只需要参数Xargs!!将前面输出作为后面命令的参数echo "/" | xargs ls -l •xargs:命令–1,在标准输入中读取到的内容!–2,自己的参数理解为一个字符串•模仿shell,做blank切分,第一个子字符串为命令–3,将步骤1的内容做为步骤2的命令的选项参数拼接起来–4,执行得到的结果

三、文本处理

3.0 linux中的正则表达式

hello.txt

hello world

are you ok?

areyou ok?

areyou are youok?

aaare you ok?

aare you ok

aaaare you ok

abcre you ok?

xxre you ok

are yyyou ok?

xk

zk

ok

yk

zzk

zxzxk

bxx

cxx

dxx

areyou are youok?

zk kz 1

kz zk 2

okk koo 3

zkkz

kzzk

cp /etc/profile .

grep “after” profile #查找文件内的包含该单词的行

grep -n “after” profile #添加查找的行在文档的行号。

-v表示不包含的

[root@bk1 ~]# grep -v “after” profile | grep “after”

[root@bk1 ~]# grep -v “pathmunge” profile | grep “after”

if [ “$2” = “after” ] ; then

3.0.1 匹配符:

1.\ 转义字符

2… 匹配任意单个字符

3.[1234abc],[^1234],[1-5],[a-d] 字符序列单字符占位

4.^ 行首

5.$ 行尾

6.<,>,<abc,abc>,<are> 单词首尾边界 okhelloworld ok hello world

7.| 连接操作符

8.(,) 选择操作符

9.\n 反向引用

匹配are aare xre,0到多个a字符

grep “a*re” hello.txt

匹配“a任意单个字符re”

grep “a.re” hello.txt

3.0.2 重复操作符:

1.* 匹配0到多次

2.? 匹配0到1次

3.+ 匹配1到多次

4.{n} 匹配n次

5.{n,} 匹配n到多次

6.{m,n} 匹配n到m次

粗体是扩展匹配,其他是基本匹配。

与扩展正则表达式的区别: grep basic grep默认工作于基本模式

-E选项让grep工作于扩展模式

匹配a一个到多个任意字符re

[root@bk1 ~]# grep “a+re” hello.txt

发现查询不出来,为什么?

[root@bk1 ~]# grep -E “a+re” hello.txt

或者

[root@bk1 ~]# grep “a+re” hello.txt

基本正则表达式中元字符

?,+,{,|,(和)丢失了特殊意义,需要加\,反斜杠:

?,+,{,|,(,以及),扩展模式不需要加反斜杠

所有字母和数字匹配自身,元字符可以添加\转义

[a-d]匹配abcd中的一个

[^a-d]匹配不是abcd中的任意一个的字符

需要注意:要使用[a-d]是abcd任意一个的传统方括号表达式的解释,需要设定环境变量:LC_ALL的值是C。参考链接

开始:

匹配包含bcd中任意一个字符的行

grep “[b-d]” hello.txt

基本正则模式,查找带问号的行

grep “?” hello.txt

.不代表重复,任意一个字符

grep “a.re” hello.txt

grep “a…re” hello.txt

grep “…re” hello.txt

grep “…re” hello.txt

匹配zk和xk

grep “[xz]k” hello.txt

匹配不是zk和xk的

grep “<[^zx]k” hello.txt

匹配行首,该行第二个字符一定得是k

grep “^.k” hello.txt

匹配行尾,

grep “.k$” hello.txt #该行最少两个字符,最后一个是k

匹配单词边界

grep “<are>” hello.txt

匹配单词开头:

grep “<are” hello.txt

匹配单词尾:

grep “re>” hello.txt

grep “<a*re>” hello.txt表示0到多次,单词以a字符开头,或者不以a字符开头

grep “<you>” hello.txt

连接操作,取并集

grep -E "(<are>)|(<you>)" hello.txt

grep -E “a{3}” hello.txt 匹配该行中3个a重复的

grep -E “a{3,}” hello.txt

grep -E “a{3}” hello.txt

匹配一个到多个a

grep -E “a+” hello.txt

匹配0到1次a

grep -E “a?” hello.txt

课后练习:

aaa?匹配aa,aaa

grep -E “<aaa?re” hello.txt #以aa或aaa开头并带有re的单词的行

aare aaare aaaare

grep -E “aaa?” hello.txt #包含aa或aaa的行

grep “aaa?” hello.txt

匹配一次到多次:aaa和aaaa

grep “aaa+” hello.txt

扩展模式:

grep -E “aaa+” hello.txt

将匹配1次到多次的+再转义为+字符匹配

匹配0到任意多次

aaa*匹配aa,aaa,aaaa

匹配任意字符

grep -E “*” hello.txt

反向引用

myhello

abbaabba

baabbaab

abbabaab

baababba

grep -E “(ab)(ba)\1\2” myhello #匹配abba

grep -E “(ab)(ba)\2\1” myhello #匹配baab

{4}

grep:显示匹配行

-v:反显示 -e:使用扩展正则表达式-n 用于显示行号,-i 忽略大小写

匹配操作符

\转义字符.匹配任意单个字符[1249a],[^12],[a-k] 字符序列单字符占位^ 行首$ 行尾.* 匹配任意字符\<,\>:\<abc 单词首尾边界|连接操作符\(, \)选择操作符\{, \}\|,\?, \+,\n 反向引用

例1:

ooxx12121212ooxxooxx 12121212oox 121212121212 ooxx 1212oo3xxoo4xxooWxxoomxx$ooxxoo1234xxooxyzxxgrep "\(^[0-9]\|[^0-9][0-9]\)[0-9]\{2\}\([0-9][^0-9]\|[0-9]$\)" grep.txtgrep -E "^[0-9]{4}[^0-9]|[^0-9][0-9]{4}[^0-9]|[^0-9][0-9]{4}$|^[0-9]{4}$" grep.txt

例2:

aaabbcaaaaa bbc aaabb bbc bbbasgodssgoodsssagodssgoodasgodssgoodsssagoodssgod51 grep "a" test52 grep "a\{3\}" test 53 grep "\<aaa" test 54 grep "\<aaa\>" test 55 grep "b" test 56 grep "b\{2,3\}" test 59 grep "god" test 60 grep "godgood" test61 grep "god*good" test 62 grep "god.*good" test 63 grep "god.*good.*god.*good" test 64 grep "god.*good+" test 65 grep "\(god.*good\)+" test 66 grep "\(god\).*good.*\1" test 67 grep "\(god\).*\(good\).*\1.*\2" test69 grep "\(god\).*\(good\).*\1.*\2" test70 grep "\(god\).*\(good\).*\2.*\1" test

3.1 cut:显示切割的行数据

- s:显示分隔符的行- d:自定义分隔符-f 选定显示哪些列m-n m列到n列-n 第一列到n列m- 第m列到最后列n 第n列

以:作为分隔符,切割passwd,输出从第3个字段到第5个字段

cut -d “:” -f 3-5 /etc/passwd

输出前两列内容:

cp /etc/passwd ./

cut -d “:” -f -2 passwd

输出字段3到最后一个字段

cut -d “:” -f 3- passwd

指定输出的分隔符:

cut -d “:” -f 3- --output-delimiter="…" passwd

输出第7个字段:

cut -d “:” -f 7 passwd

如果有的行没有分隔符,则输出会包含脏数据

echo helloworld 1>> passwd

cut -d “:” -f1 passwd

可以使用-s选项:

不打印没有分隔符的行:

cut -s -d “:” -f1 passwd

显示1,3,7列

– output-delimiter指定输出的时候的各字符分隔符

cut -d “:” -f 1,3,7 –s passwd

cut -d “:” -f 1,3,7 –s --output-delimiter="|" passwd

3.2 sort:排序文件的行

-t:自定义分隔符-k:选择排序列-n:按数值排序-r:倒序**-u:合并相同行-f:忽略大小写sort.txta b 1dfdsa fdsa 15fds fds 6fdsa fdsa 8fda s 9aa dd 10h h 11

默认字典序排序

sort sort.txt

指定字段分隔符,按照第2个字段的字典序排序

sort -t ’ ’ –k2 sort.txt

指定字段分隔符,按照第3个字段的值数值序排序

sort -t’ ’ -k 3 -n sort.txt

指定字段分隔符,按照第3个字段的值数值倒序

sort -t’ ’ –k 3 -nr sort.txt

3.3 wc:统计文本信息(行数,单词个数,字符个数)

wc [选项列表]... [文件名列表]...DESCRIPTION 描述对每个文件输出行、单词、和字节统计数,如果指定了多于一个文件则还有一个行数的总计。没有指定文件或指定的文件是 -,则读取标准输入。-c, --bytes, --chars 输出字节统计数。-l, --lines 输出换行符统计数。-L, --max-line-length 输出最长的行的长度。-w, --words 输出单词统计数。--help 显示帮助并退出--version 输出版本信息并退出[root@bk1 ~]# wc sort.txt 7 21 66 sort.txt[root@bk1 ~]# wc -l sort.txt 7 sort.txt[root@bk1 ~]# cat sort.txt | wc -l7[root@bk1 ~]# wc -w sort.txt21 sort.txt[root@bk1 ~]# wc -c sort.txt66 sort.txt

3.4 sed:行编辑器sed [options] ‘AddressCommand’ file …

-n: 静默模式,不再默认显示模式空间中的内容

-i: 直接修改原文件

-e SCRIPT -e SCRIPT:可以同时执行多个脚本

-f /PATH/TO/SED_SCRIPT

-r: 表示使用扩展正则表达式

AddressCommand

d: 删除符合条件的行;

a\string: 在指定的行后面追加新行,内容为string

\n:可以用于换行

i\string: 在指定的行前面添加新行,内容为string

s/pattern/string/修饰符: 查找并替换,默认只替换每行中第一次被模式匹配到的字符串

g: 行内全局替换i: 忽略字符大小写s///: s###, s@@@\(\), \1, \2可以没有;给定范围;查找指定行/str/

p: 显示符合条件的行;

r FILE: 将指定的文件的内容添加至符合条件的行处

w FILE: 将地址指定的范围内的行另存至指定的文件中;

cp /etc/inittab .sed 's/\(id:\)[0-6]\(:initdefault:\)/\15\2/ig' inittabsed "s/\(IPADDR=\(\<2[0-5][0-5]\|\<2[0-4][0-9]\|\<1\?[0-9][0-9]\?\.\)\{3\}\).*/\188/" ifcfg-eth0ed.txtAuthentication improvements when using an HTTP proxy server.Support for POSIX-style filesystem extended attributes.YARN's REST APIs now support write/modify operations.第一行下插入一行sed "1a\hello world" sed.txt直接修改文件sed -i "1a\hello world" sed.txt删除第2行sed -i "2d" sed.txt删除文档中的每一行sed "d" sed.txt原来的内容要打印,匹配的行要打印,找到的行会打印两次sed "/[0-9]/p" sed.txt匹配行中包含0-9任意一个字符的行,只打印找到的行sed -n "/[0-9]/p" sed.txt将filesystem替换为FSsed "s/filesystem/FS/" sed.txt忽略大小写sed "s/filesystem/FS/i" sed.txt不仅忽略大小写还要行内全局替换sed "s/filesystem/FS/gi" sed.txtcp /etc/inittab ./将文件中的默认运行级别改为5sed "s/[0-6]/5/" inittab发现将所有匹配的都修改了(注意并未修改原文件),匹配访问太广了。更精确匹配方案的写法应该为如下命令:sed "s/id:[0-6]:initdefault:/5/" inittab但是还存在问题,匹配后被修改内容问匹配出的部分,范围过大。解决办法:反向引用sed "s/\(id:\)[0-6]\(:initdefault:\)/\15\2/" inittab分析:sed "s/\(id:\)[0-6]\(:initdefault:\)/\15\2/" inittabid:num:initdefalut: \15\2id:5:initdefault:也可以写成:sed -r "s/(id:)[0-6](:initdefault:)/\15\2/" inittab查找/etc/profile中包含PATH的行,将这些行写到指定的文件:hello.hello中sed -n "/PATH/w hello.hello" /etc/profile

3.5 awk:强大的文本分析工具

相对于grep的查找和sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大;

简单来说awk就是把文件逐行的读入,(空格,制表符)为默认分隔符将每行切片,切开的部分再进行各种分析处理。

3.5.1 -F 自定义分隔符

支持自定义变量,数组 a[1] a[tom] map(key)支持内置变量

NF 浏览记录的域的个数NR 已读的记录数ARGC命令行参数个数ARGV命令行参数排列ENVIRON 支持队列中系统环境变量的使用FILENAME awk浏览的文件名FNR浏览文件的记录数FS设置输入域分隔符,等价于命令行 -F选项OFS输出域分隔符ORS输出记录分隔符RS 控制记录分隔符

3.5.2 支持函数

print、split、substr、sub、gsub

3.5.3 支持流程控制语句,类C语言

if、while、do/while、for、break、continue

搜索/etc/passwd有root关键字的所有行cp /etc/passwd ./awk '/root/ { print $0}' passwd统计/etc/passwd文件中,每行的行号,每行的列数,对应的完整行内容awk -F ':' '{print NR "-" NF "-" $0}' passwd打印第一列逐行处理awk -F':' ' { print $1} ' passwdcut -d ':' -f1 passwd指定字符拼接awk -F':' ' { print $1"," $7} ' passwd制表符拼接字段awk -F':' ' { print $1"\t" $7} ' passwd之前做点儿事情,之后做点儿事情awk -F':' 'BEGIN{print "name\tshell"} {print $1"\t" $7} END{print "abdfafdsafdsa"}' passwd查找并打印整行awk ' /root/ {print $0}' passwd查找并截取打印某字段awk -F ":" ' /root/ {print $1}' passwd查找并打印awk ' /root/ {print $0,"ok"} {print $0}' passwdawk -F ':' ' /root/ {print $1,"ok"} {print $0}' passwd打印已读记录数和字段个数awk -F':' '{print NR "\t" $0 "\t" NF}' passwdawk -F ':' '{print $0 "-" NR "-" NF}' passwd

3.5.4 举例

只显示/etc/passwd的账户:

awk -F':' '{print $1}' passwd只显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行开始前添加列名name,shell,在最后一行添加"blue,/bin/nosh"(cut,sed)

awk -F':' 'BEGIN{print "name,shell"} {print $1 "," $7} END{print "blue,/bin/nosh"}' passwd搜索/etc/passwd有root关键字的所有行

awk '/root/ { print $0}' passwd

统计/etc/passwd文件中,每行的行号,每行的列数,对应的完整行内容awk -F’:’ ‘{print NR “\t” NF “\t” $0}’ /etc/passwd`

统计报表:合计每人1月工资,0:manager,1:worker

awk '{split($3,date,"-");if(date[2]=="01"){name[$1]+=$5;if($2=="0"){role[$1]="M"}else{role[$1]="W"}}} END{for(i in name){print i "\t" name[i]"\t" role[i]}}' awk.txt

test.sh

{split($3,date,"-");if(date[2]=="01"){name[$1]+=$5}if($2=="0"){role[$1]="manager"}else{role[$1]="worker"}}} END{for(i in name){print i "\t" name[i]}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。