linux基础操作10------(特殊符号,正则表达式,三剑客)

一.前言

前面都已经把linux基础脉络都讲完了,而今天要说的是稍微进阶的,大家还是做个了解就行,有个大概印象,遇到要用的时候能够知道就可以了,看似很多,其实还是很少的。

二.linux特殊符号

2.1 #号

#号:注释、备注、批注,系统自动忽略,不执行。

root@localhost \~\]# sdddddddddddddddddddddddddddddddddddddddd -bash: sdddddddddddddddddddddddddddddddddddddddd: 未找到命令 \[root@localhost \~\]# \[root@localhost \~\]# # sdddddddddddddddddddddddddddddddddddddddd # 这就不报错了,因 为系统不执行被#号注释的内容 # 在linux系统上的指令和配置是通过#号注释的,而开发中,编程语言里面不同的语言也有不同的注释号, 比如//、'''注释内容'''、#、/\*\*/等等

2.2 shell命令中的其他符号

1、 ;命令的分隔符,通过它可以连接多条指令,一起执行

例子:

root@localhost \~\]# touch 111.txt;chmod 777 111.txt \[root@localhost \~\]# ll 111.txt -rwxrwxrwx 1 root root 0 9月 12 04:40 111.txt 2、 ..代表上级目录 例子: \[root@localhost \~\]# pwd /root \[root@localhost \~\]# cd .. \[root@localhost /\]# pwd / # cd ../../../../../../../../,当..很多时,就会到根目录/ 3、 .代表当前目录 例子: \[root@localhost opt\]# cp /data/man_db.conf . \[root@localhost opt\]# ls man_db.conf 4、变量和常量 变量,值是不固定的,比如:我的女朋友=xxx,这个xxx不是固定的。我的女朋友就是变量。别人记不住 你对象名字的时候,就这么问,你对象呢?而不是直呼其名。 常量,值是固定。圆周率=3.1415926...,固定的值,不会变。 env命令可以查看系统内置的环境变量:和windows的环境变量类似。系统变量就是让一些在调用的时候 比较麻烦或者说寻找的时候路径比较长的功能变得简单化。系统内部处理时,会根据变量的值做出不同的反 应。 \[root@localhost \~\]# env XDG_SESSION_ID=1 HOSTNAME=localhost.localdomain # 变量作用:比如HOSTNAME这个变量,它的值比较长, 系统内部程序会经常用到这个值,那么用一个变量存放,以后想用这个值,就用这个变量即可,简单很多,而 且只要修改了这个值,其他使用这个变量的地方,值都会跟着变化,方便修改。 TERM=xterm SHELL=/bin/bash HISTSIZE=1000 # 这就是为什么历史命令只记录1000的原因。 SSH_CLIENT=192.168.61.1 50670 22 SSH_TTY=/dev/pts/0 USER=root # 当前登录用户,其他用户登录的时候,这个变量对应的值就变为了其他用户名 ... LANG=zh_CN.UTF-8 # language的简写,装系统的时候,你安装的英文,这里就是en_US,中文就是zh_CN ... # 查看某个变量的值 $符号+变量名称: \[root@localhost \~\]# echo $LANG zh_CN.UTF-8 # 我们改一下语言变量,来看看效果,比如之前命令的参数介绍都是中文的,export用来声明环境 变量、修改环境变量等,如下: \[root@localhost \~\]# usermod --help 用法:usermod \[选项\] 登录 选项: -c, --comment 注释 GECOS 字段的新值 -d, --home HOME_DIR 用户的新主目录 ... \[root@localhost \~\]# export LANG=en_US.UTF-8 \[root@localhost \~\]# usermod --help # 全部变英文了 Usage: usermod \[options\] LOGIN Options: -c, --comment COMMENT new value of the GECOS field -d, --home HOME_DIR new home directory for the user account ... # 也就是说,改动环境变量,会对系统有影响,因为系统中使用这个变量的功能都会随着变量的值 而做不同的处理。 5、 ""双引号,换行,解析变量 比如:echo,本来只能输出单行文本内容,加上双引号支持换行输入和输出 \[root@localhost \~\]# echo hello hello \[root@localhost \~\]# echo "hello \> jaden \> " hello jaden \[root@localhost \~\]# echo "hello jaden " \> jaden.txt # 还可以输出到某个文件中 \[root@localhost \~\]# cat jaden.txt hello jaden 有时候比vi用起来方便。 # ""能够解析变量,如下 \[root@localhost \~\]# echo "$LANG" en_US.UTF-8 6、 ''单引号,换行,不解析变量 # 单引号不能解析变量,其他功能和双引号类似,如下 \[root@localhost \~\]# echo '$LANG' $LANG 7、\\和/ #这些我们都说过 \\ 转义符,反斜杠 / 路径分隔符 8、! 历史命令调用,在find命令中是取反的意思。 \[root@localhost \~\]# history \[root@localhost \~\]# !47 # 历史指令序号 9、\* 通配符,我们将find的之后用到过,可以匹配任意字符 \[root@localhost \~\]# ls \*.txt # 查看所有.txt结尾的文件 jaden.txt 10、$ 调用变量 例子1: \[root@localhost \~\]# export LANG='en_US.UTF-8' \[root@localhost \~\]# echo $LANG en_US.UTF-8 \[root@localhost \~\]# stat 111.txt File: '111.txt' Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fd00h/64768d Inode: 33575641 Links: 1 Access: (0777/-rwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2021-09-12 04:40:28.399177386 +0800 Modify: 2021-09-12 04:40:28.399177386 +0800 Change: 2021-09-12 04:40:28.400260737 +0800 Birth: - \[root@localhost \~\]# export LANG='zh_CN.UTF-8' \[root@localhost \~\]# stat 111.txt 文件:"111.txt" 大小:0 块:0 IO 块:4096 普通空文件 设备:fd00h/64768d Inode:33575641 硬链接:1 权限:(0777/-rwxrwxrwx) Uid:( 0/ root) Gid:( 0/ root) 最近访问:2021-09-12 04:40:28.399177386 +0800 最近更改:2021-09-12 04:40:28.399177386 +0800 最近改动:2021-09-12 04:40:28.400260737 +0800 创建时间:- # 还有很多指令的帮助信息即便设置了中文,它的帮助信息都是英文,比如curl \[root@localhost \~\]# curl --help # 因为汉化这个事情,是好多人做的,而且要做很久,但是系统还会更新,还没汉化完,就又更新系统 了,还需重新汉化,所以这样不划算,汉化组就解散了,所以有些指令就不汉化了。而且有时候汉化出来的意 思和英语本来的意思不同,因为参与汉化的人有些不是计算机专业的,这就很尴尬。 # 使用变量的时候要小心,比如有些人操作变量的时候,删除了根目录,如下 \[root@localhost \~\]# jaden=/tmp # 定义变量 \[root@localhost \~\]# echo $jaden # 查看变量值 /tmp \[root@localhost \~\]# rm -rf $jaden/\* # 利用变量做删除,这是删除/tmp目录下的所有内容 # !!!但是,如果变量名写错了,如下 \[root@localhost \~\]# rm -rf $jadn/\* # 少写了个e字母,系统做删除的时候,找不到这个变 量,那么会变成如下效果\[ root@localhost \~\]# rm -rf /\* # 就删除根目录了!!!!!系统崩溃了就。所以看到删除命 令,就一定要特别的小心。 11、\> 输出重定向、\>\>追加输出重定向、\< 输入重新定向、\<\<追加输入重定向 12、\| 管道 13、\|\| #第一个命令失败,才执行第二个命令,第一个指令成功了,不会执行第二个指令 #指令连接符号,之前说过; 除了它,还有 \|\| 和 \&\&,分号是两个指令都会执行,哪个出错都不影响 其他的指令。 \[root@localhost \~\]# echo 123 \|\| ls 123 \[root@localhost \~\]# ech 123 \|\| ls -bash: ech: command not found anaconda-ks.cfg jaden.txt 14、\&\& # 和,两个一起执行,如果第一个失败了,两个都不执行,如果第一个成功了,第二个失败了,就执行第 一个,如果两个都成功了,就都执行。 \[root@localhost \~\]# echo 123 \&\& ls 123 anaconda-ks.cfg jaden.txt \[root@localhost \~\]# ech 123 \&\& ls -bash: ech: command not found \[root@localhost \~\]# echo 123 \&\& lx 123 -bash: lx: command not found 15、\& # 后台运行 # 比如top指令,之前运行top,会占住终端,除非结束top,不然不能执行其他指令 \[root@localhost \~\]# top \& \[1\] 16567 \[root@localhost \~\]# ps -ef \|grep top root 16567 1467 0 16:56 pts/0 00:00:00 top root 16569 1467 0 16:57 pts/0 00:00:00 grep --color=auto top 16、\~ 代表家目录,不同的用户家目录不同。 \[root@localhost \~\]# cd /tmp/ \[root@localhost tmp\]# cd \~ \[root@localhost \~\]# cd /tmp \[root@localhost tmp\]# cd # 其实cd什么参数都不加,也是回到家目录 \[root@localhost \~\]# 7、\` 反引号(Esc 下边的按钮)\` # 用来嵌套命令,反引号中的命令先执行 例子1: \[root@localhost \~\]# mkdir \`echo jaden\` \[root@localhost \~\]# ls anaconda-ks.cfg jaden jaden.txt 例子2:\[ root@localhost opt\]# touch test_\`date +%T\`.txt \[root@localhost opt\]# ls test_04\\:56\\:22.txt test_04:56:22.txt 例子3: \[root@localhost \~\]# tar zcf /tmp/etc.tar.gz \`find /etc -type f -name "\*.conf"\` tar: Removing leading \`/' from member names \[root@localhost \~\]# ls /tmp/ etc.tar.gz \[root@localhost \~\]# tar tf /tmp/etc.tar.gz # 查看压缩包里面的文件内容

关于特殊符号,我们就说这么多。

三.正则表达式

1.什么是正则表达式?

简单的说,正则表达式就是一套处理大量的字符串而定义的规则和方法。

例如:假设 @代表1234 北京邮电大学--by

通过正则表达式这些特殊符号,我们可以快速的过滤、替换需要的内容。

linux正则一般以行为单位处理的。

2.正则表达式

准备示例:[root@localhost ~]# head -100 /etc/services > test.txt

  1. ^ 表示搜索以什么开头。

root@localhost \~\]# grep '\^#' test.txt # 找出开头为#号的的行数据\[ root@localhost \~\]# grep -v '\^#' test.txt # 找出开头不是#号的行数据 2) $ 表示搜索以什么结尾。 \[root@localhost \~\]# grep 'ol$' test.txt # 找出结尾为ol字母的行数据 3) \^$ 表示空行,不是空格。 \[root@localhost \~\]# grep '\^$' test.txt # 找出所有的空白行。 \[root@localhost \~\]# grep -v '\^$' test.txt # 找出所有的非空白行数据,如果保存一下, 那么相当于快速删除所有空行。 # sed删除空行,更容易,因为它更擅长修改文件内容 \[root@localhost \~\]# sed '/\^$/d' test.txt # 加上-i就改了原文件 4) . 代表且只能代表任意一个字符。跟癞子斗地主中的癞子一样。 \[root@localhost \~\]# grep '.dp' test.txt # 找出xdp,x可以是任意一个字符,注意,是一 个! 5) \\ 转义字符,让有着特殊身份意义的字符,脱掉马甲,还原原型。 例如:\\.只表示小数点,还原原始小数点的意义。 \[root@localhost \~\]# grep '\\.ia' test.txt # 这就表示,找到含有.dp的行数据 6) \* 重复0个或多个前面的一个字符。不代表所有了。 # 准备一个测试数据: \[root@localhost \~\]# vi num.txt \[root@localhost \~\]# cat num.txt a 12222 b 12222222 c 1 b 3 d 122222222222222 e 12 a 4 # 看下面几个的效果就知道\*的意思了。 \[root@localhost \~\]# grep '2' num.txt \[root@localhost \~\]# grep '22' num.txt \[root@localhost \~\]# grep -o '22' num.txt # -o就能看出来,它是两个字符两个字符的匹 配 \[root@localhost \~\]# grep '12' num.txt 、 \[root@localhost \~\]# grep '12\*' num.txt \[root@localhost \~\]# grep '.\*' num.txt # 匹配所有字符 \[root@localhost \~\]# grep '12.\*' num.txt 7) .\* 匹配所有的字符。\^.\* 任意多个字符开头。 \[root@localhost \~\]# grep '12.\*' num.txt # 小任务: # 1.复制一份/etc/services的前100行数据到serv文件中,然后将去掉serv文件中所有含有#的行和空行 \[root@localhost \~\]# head -100 /etc/services \> serv # 用sed来玩: \[root@localhost \~\]# sed '/#/d' serv # 去掉含有#号的行 \[root@localhost \~\]# sed '/\^$/d' serv # 去掉所有空行 # 用grep来玩: \[root@localhost \~\]# grep -Ev '\^$\|#' serv \> ss.txt \[root@localhost \~\]# cat ss.txt # 2. 去掉aaa.txt文件中所有的空行和注释(注意:一行中可能只有部分是注释) \[root@localhost \~\]# cat aaa.txt hello -a #a表示友好 hello -b #b表示不友好 hello -c #c表示骂人 # 哈哈,这是个啥 # what? hello -d #d表示非常爱你 \[root@localhost \~\]# grep '#.\*' aaa.txt # 这么写,可以将所有#号注释的内容全部匹配到,所 以这个正则表达式可以用 \[root@localhost \~\]# sed -i 's/#.\*//g' aaa.txt # 将#.\*匹配到的内容全部替换为空。 \[root@localhost \~\]# sed -i '/\^$/d' aaa.txt # 再去除空行 \[root@localhost \~\]# cat aaa.txt # 结果就ok了。 hello -a hello -b hello -c hello -d 8) \[abc\] 匹配字符集合内任意一个字符\[a-z\]、\[0-9\]、\[A-Z\],多选一,\[0,9\]这个是2选1. \[root@localhost \~\]# grep -E '\[0-9\]' serv \[root@localhost \~\]# grep -E '\[0,9\]' serv 9) \[\^abc\] \^在中括号里面表示非,不包含a或b或c。 \[root@localhost \~\]# grep -E '\[\^0-9\]\*' serv # 不要数字 \[root@localhost \~\]# grep -E '\[\^a-z\]' serv # 不要小写字母 \[root@localhost \~\]# grep -E '\[\^a-z0-9A-Z\]' serv # 不要字母和数字 10) {n,m} 重复n到m次,前一个字符。 #匹配一下ip地址:0.0.0.0 -- 255.255.255.255,这是ip地址的范围,个数上就是7-15个 \[root@localhost \~\]# grep -Eo '\[0-9.\]{7,15}' /var/log/secure # 但是如果有个大于7位的数字,也会被匹配上8888888 \[root@localhost \~\]# grep -Eo '\[0-9.\]{7,15}' /var/log/secure\|grep '\\.' 11) + 重复1次到多次,和\*不同 \[root@localhost \~\]# grep -E '19\*' serv \[root@localhost \~\]# grep -E '19+' serv 12) ? 重复0次到多次,和\*号很像。 \[root@localhost \~\]# grep -Eo '\[0-9\]?' serv 13)\\d 和\[0-9\]是一样的,但是它属于perl正则,grep使用perl正则的时候需要用-P参数来指定 \[root@localhost \~\]# grep -E '\\d' 22.txt \[root@localhost \~\]# grep -P '\\d' 22.txt

取ip的例子:

前面我们grep -Eo '[0-9.]{7,15}' /var/log/secure,找ip不是很准确,因为如果有个大于7位的 数字,也会被匹配上

ip addr|grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'

grep 'Failed password' secure |grep -Eo '[0-9]{1,3}\.[0-9.]+'

取root用户登录时间

lastlog|sed -n '/root/p'|grep -Eo '[0-9]{2}:[0-9]{2}:[0-9]{2}'

关于正则,我们简单学习这么多即可,不要深究昂,因为正则的东西太多了,后面遇到了复杂的我们在 分析。

perl正则:https://www.runoob.com/perl/perl-regular-expressions.html

当然上面的三剑客还没有说,下面会说的

四.linux三剑客

三剑客就是三个强大的命令。后期讲应急溯源的时候会用到。grep用的最多,所以我们重点讲解这个指 令。三剑客配合正则表达式可以发挥很牛的作用。

4.1 grep

#擅长过滤,或者说查找,按行来过滤

例子:/var/log/secure是记录用户登录系统的行为的,登录成功还是失败,系统都会自动记录这次登录动作。

root@localhost \~\]# grep 'Failed password' /var/log/secure Mar 25 18:20:48 localhost sshd\[16905\]: Failed password for root from 192.168.61.1 port 55577 ssh2 ... # 如果我们想将所有登录失败的ip地址找出来,可以再次过滤 # 比如查看某个ip地址登录了多少次\[root@localhost \~\]# grep 'Failed password' /var/log/secure\|grep '192.168.61.1'\|wc -l 3 # 可以借助正则表达式来进行过滤,可以将内容过滤的很精确,有些在线的网站也可以帮我们生成一些常用的 正则表达式,比如https://www.hake.cc/tools/regexcode/ \[root@localhost \~\]# grep 'Failed password' /var/log/secure\|grep --color -P " (25\[0-5\]\|2\[0-4\]\\d\|\[0-1\]\\d{2}\|\[1-9\]?\\d)\\.(25\[0-5\]\|2\[0-4\]\\d\|\[0-1\]\\d{2}\|\[1-9\]?\\d)\\. (25\[0-5\]\|2\[0-4\]\\d\|\[0-1\]\\d{2}\|\[1-9\]?\\d)\\.(25\[0-5\]\|2\[0-4\]\\d\|\[0-1\]\\d{2}\|\[1-9\]?\\d)" Mar 25 18:20:48 localhost sshd\[16905\]: Failed password for root from 192.168.61.1 port 55577 ssh2 # ip地址都标红色了,表示匹配出来了。 # 如果只要ip地址-Po \[root@localhost \~\]# grep 'Failed password' /var/log/secure\|grep --color -Po " (25\[0-5\]\|2\[0-4\]\\d\|\[0-1\]\\d{2}\|\[1-9\]?\\d)\\.(25\[0-5\]\|2\[0-4\]\\d\|\[0-1\]\\d{2}\|\[1-9\]?\\d)\\. (25\[0-5\]\|2\[0-4\]\\d\|\[0-1\]\\d{2}\|\[1-9\]?\\d)\\.(25\[0-5\]\|2\[0-4\]\\d\|\[0-1\]\\d{2}\|\[1-9\]?\\d)" 192.168.61.1 # 有些ip地址是重复的,因为尝试登录了很多次,那么可以先排序,再去重,来查看ip地址\[root@localhost \~\]# grep 'Failed password' /var/log/secure\|grep --color -Po " (25\[0-5\]\|2\[0-4\]\\d\|\[0-1\]\\d{2}\|\[1-9\]?\\d)\\.(25\[0-5\]\|2\[0-4\]\\d\|\[0-1\]\\d{2}\|\[1-9\]?\\d)\\. (25\[0-5\]\|2\[0-4\]\\d\|\[0-1\]\\d{2}\|\[1-9\]?\\d)\\.(25\[0-5\]\|2\[0-4\]\\d\|\[0-1\]\\d{2}\|\[1-9\]? \\d)"\|sort -n \|uniq -c 2 192.168.2.113 3 192.168.2.116 1 192.168.61.1 # 比如,如果看到了这么个ip地址164.90.232.121、164.90.232.241等尝试登录了你上千上万次,就是 在爆破攻击我们,百度一查,德国的 # 我们可以直接拉黑这个ip地址,也叫做加黑,加入黑名单的意思,这个等后面我再教大家。 # 为了演示下面的参数,我们先创建一个示例环境,也就是一个练习文件: \[root@localhost log\]# cd /root/ \[root@localhost \~\]# head -50 /etc/services \> test.txt \[root@localhost \~\]# ls 2.txt anaconda-ks.cfg jaden jaden17:52:30.txt jaden.txt test.txt xx.txt #grep参数 -n 显示行号 \[root@localhost \~\]# grep -n 'tcp' test.txt # vi test.txt +48,表示进入vi的时候,光标直接定位的48行起始位置。 -c 对结果行计数 \[root@localhost \~\]# grep -c 'tcp' test.txt 14 -i 不区分大小写 \[root@localhost \~\]# grep -n 'tcp' test.txt -i -v 反向搜索,取反 \[root@localhost \~\]# grep -n 'udp' test.txt -v # 将不含有udp的行全部过滤出来 -w 精准匹配 \[root@localhost \~\]# grep -w 'tcp' test.txt -o 只显示匹配的结果,前面的第一个示例中我们用过-o参数 \[root@localhost \~\]# grep -o -n 'tcp' test.txt -A1 同时打印搜索结果行的后一行 ,A是after的简写 \[root@localhost \~\]# grep -A2 'ftp' test.txt \[root@localhost \~\]# grep -A 2 'ftp' test.txt -B3 同时打印搜索结果行的前三行,B是before的简写 \[root@localhost \~\]# grep -B2 'ftp' test.txt -C2 同时打印搜索结果行的上下各两行 \[root@localhost \~\]# grep -C2 'ftp' test.txt -E 扩展正则表达式 # 正则我们下面会细讲,先简单了解一下。 \[root@localhost \~\]# grep -E '.tp' test.txt # .就是正则表达式,表示任意的一个字符 \[root@localhost \~\]# grep -E 'ftp\|ssh' test.txt # 查找ftp或者ssh,\|是或者的意思, 可以用多个ftp\|ssh\|telnet... -P 使用perl正则 # perl语言中设计的正则表达式写法规则,很强大,很多领域都支持perl正则的语法结构。 \[root@localhost \~\]# grep -P "\\d+" test.txt # 匹配所有的数字 \[root@localhost \~\]# grep -P "\\d{4,}" test.txt #匹配4位的数字

4.2 sed

这个我们用的其实很少,所以大家简单学习一下即可。

#擅长取行和修改替换

用法:sed [-nri] [动作] 目标文件文件

选项与参数:

-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端 上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。

-r :sed 的动作支持的是延伸型正则表示法的语法。(默认是基础正则表示法语法)

-i :直接修改读取的文件内容,而不是输出到终端。

动作说明: [n1[,n2]]function

n1, n2一般表示为行号,[,n2]表示这个参数可选,可有可无。

function:

a :指定行后面插入一行

d :删除

i :指定行前面插入一行

p :打印,#一般和前面的-n参数一起用

s :替换 需要I忽略大小写,全局替换需要g

sed过滤

sed也可以进行过滤,如下简单示例

root@localhost \~\]# seq 5 \> 1.txt \[root@localhost \~\]# vi 1.txt # 修改为如下内容 \[root@localhost \~\]# cat 1.txt 1 2c 3a 4b 5a \[root@localhost \~\]# sed '/a/p' 1.txt #默认会将所有行都打印出来,并且匹配到的a所在的 行重新打印一遍 1 2c 3a 3a 4b 5a 5a \[root@localhost \~\]# sed -n '/a/p' 1.txt # 加上-n,进入安静(silent)模式,就不会 将所有内容打印出来了。 3a 5a # sed过滤相比grep来说,就比较麻烦。所以,过滤我们一般用grep。 \[root@localhost \~\]# sed -n '/tcp/p' test.txt # 也能过滤出tcp所在的行 # sed删除匹配的行数据 \[root@localhost \~\]# sed '/tcp/d' test.txt # 删除所有带tcp的行,并不是删除原文件 中的数据,而是将删除之后的结果打印出来了。 # 所以只需要一个重定向,就拿到删除之后的结果了 \[root@localhost \~\]# sed '/tcp/d' test.txt \> 2.txt \[root@localhost \~\]# cat -n 2.txt # -i就可以直接删除原文件的数据 \[root@localhost \~\]# sed -i '/tcp/d' test.txt \[root@localhost \~\]# cat -n test.txt \[root@localhost \~\]# sed -i '/udp/d' test.txt \[root@localhost \~\]# cat -n test.txt \[root@localhost \~\]# sed '/\^#/d' test.txt # 删除以#开头的行,\^表示以什么开头的正则表 达式,我没有加-i昂 # 指定行号来删除 \[root@localhost \~\]# sed '1,10d' test.txt # 删除1-10行的数据 \[root@localhost \~\]# sed -i '1,10d' test.txt # 只要1-5行的数据 \[root@localhost \~\]# sed -n '1,5p' test.txt # 只要第5行的数据 \[root@localhost \~\]# sed -n '5p' test.txt # 插入数据 # 在第三行后面插入一行数据 \[root@localhost \~\]# sed '3a hello jaden' 1.txt 1 2c 3a hello jaden 4b 5a # 在第2行前面插入一行数据 \[root@localhost \~\]# sed '2i hello jaden' 1.txt 1 hello jaden 2c 3a 4b 5a # 加上-i参数就能直接修改原文件 \[root@localhost \~\]# sed -i '2i hello jaden' 1.txt \[root@localhost \~\]# cat 1.txt 1 hello jaden 2c 3a 4b 5a # 替换数据 # 把3a替换成wuLAOBAN \[root@localhost \~\]# sed 's#3a#wuLAOBAN#' 1.txt 1 hello jaden 2c wuLAOBAN 4b 5a \[root@localhost \~\]# sed -i 's#3a#wuLAOBAN#' 1.txt \[root@localhost \~\]# cat 1.txt 1 hello jaden 2c wuLAOBAN 4b 5a # 把A替换成xxx,每行只替换一次,同一行的第二个及之后的A都不进行替换 \[root@localhost \~\]# sed 's#A#xxx#' 1.txt 1 hello jaden 2c wuLxxxOBAN 4b 5a # 把所有的A都替换成xxx \[root@localhost \~\]# sed 's#A#xxx#g' 1.txt 1 hello jaden 2c wuLxxxOBxxxN 4b 5a # 把所有的A和a都替换成xxx,忽略大小写,参数I \[root@localhost \~\]# sed 's#A#xxx#gI' 1.txt 1 hello jxxxden 2c wuLxxxOBxxxN 4b 5xxx

4.3 awk

擅长取列

用法,取列

比如3.txt内容如下:

2 this is a test

3 Do you like awk

This's a test

10 There are orange,apple,mongo

例子1: 取列

root@localhost \~\]# vi 3.txt \[root@localhost \~\]# cat 3.txt 2 this is a test 3 Do you like awk This's a test 10 There are orange,apple,mongo \[root@localhost \~\]# awk '{print $1}' 3.txt 2 3 This's 10 \[root@localhost \~\]# awk '{print $3}' 3.txt # 取第三列 \[root@localhost \~\]# awk '{print $NF}' 3.txt # 取每一行的最后一列,NF是固定写法 test awk test orange,apple,mongo \[root@localhost \~\]# awk '{print $1,$NF}' 3.txt # 取第一列和最后一列 2 test 3 awk This's test 10 orange,apple,mongo \[root@localhost \~\]# awk '{print $NF,$1}' 3.txt # 还可以反着写,所以通过awk,可以 将列顺序重新排版 \[root@localhost \~\]# awk '{print $1,$4}' jaden.txt # 取出第一列和第四列 例子2:计算 vi 4.txt,写上如下内容 # 水果,每斤多少钱,总共多少斤 orange 10 20 apple 20 30 mongo 50 10 banana 5 200 # 开始计算 \[root@localhost \~\]# awk '{print $1,$2\*$3}' 4.txt orange 200 apple 600 mongo 500 banana 1000 # 还可以加备注信息:\[root@localhost \~\]# awk '{print $1"总价为:",$2\*$3"元"}' 4.txt orange总价为: 200元 apple总价为: 600元 mongo总价为: 500元 banana总价为: 1000元 # 例子3:根据行号来筛选内容 # a = 1表示变量赋值,让a=1 # a == 1,表示判断一下a的值是不是等于1,等于1那么条件判断结果为真,不等1那么条件判断结果为假 # 支持符号: \> \< == \>= \<= \[root@localhost \~\]# awk 'NR==1' 4.txt # 取出第一行数据,grep不会取出特定的行,只能筛选 某些行 orange 10 20 \[root@localhost \~\]# awk 'NR\>2' 4.txt # 取出行号大于2的行数据 mongo 50 10 banana 5 200 \[root@localhost \~\]# awk 'NR\<=3' 4.txt # 取出行号小于等于3的行数据 orange 10 20 apple 20 30 mongo 50 10 \[root@localhost \~\]# awk 'NR\<=3 \&\& NR\>1' 4.txt # 取出行号大于1并且小于等于3的行 apple 20 30 mongo 50 10 # 还可以取行的同时来取列 \[root@localhost \~\]# awk 'NR\<=3{print $1}' 4.txt orange apple mongo # 例子4: # 还可以过滤出指定的行,awk也能做过滤,但是 \[root@localhost \~\]# awk '/apple/' 4.txt # 取出含有apple数据的行数据 apple 20 30 # grep、sed、awk过滤对比 grep 'apple' 4.txt sed -n '1,2p' 4.txt awk 'NR\>1 \&\& NR\<=3' 4.txt # 例子5: # 再比如我们刚才取ip地址:比直接写正则要方便很多 \[root@localhost log\]# grep 'Failed password' secure Mar 25 18:20:48 localhost sshd\[16905\]: Failed password for root from 192.168.61.1 port 55577 ssh2 Mar 25 18:49:26 localhost sshd\[1498\]: Failed password for root from 192.168.2.113 port 49991 ssh2 ... \[root@localhost log\]# grep 'Failed password' secure\|awk '{print $11}' 192.168.61.1 192.168.2.113 192.168.2.116 ... # 例子6: 指定分隔符,默认是按照空格作为分隔符的 awk -F ":" '{print $7,$1}' /etc/passwd # 这个文件都是用:做的分隔符 \[root@localhost \~\]# awk -F ':' 'NR==3 \|\| NR==5 {print $1}' /etc/passwd # 取出第三行和第五行的第一列数据,分隔符为: daemon lp # \&\&表示and,两个条件同时成立 # \|\|表示or,满足一个条件即可 # 例子7: 拼凑指定文本,双引号之间原样输出 # awk -F ":" '{print $1":123:"$7}' /etc/passwd \[root@localhost \~\]# awk -F ":" '{print $1":123:"$7}' /etc/passwd root:123:/bin/bash bin:123:/sbin/nologin ... # 例子8: 过滤文本 # awk -F "\[ /\]+" '$2\~/\^47/' 1.txt # 找出第一列数据中带h的,并取出第一列和第七列的数据 \[root@localhost \~\]# awk -F ':' '$1\~/h/{print $1,$7}' /etc/passwd shutdown /sbin/shutdown halt /sbin/halt sshd /sbin/nologin chrony /sbin/nologin apache /sbin/nologin

五.总结

今天说的内容还是很多的,但是我觉得做个了解就好了,还是点赞关注加收藏,后期要用到了再来看。

相关推荐
Johny_Zhao2 分钟前
Centos8搭建hadoop高可用集群
linux·hadoop·python·网络安全·信息安全·云计算·shell·yum源·系统运维·itsm
longxibo2 分钟前
飞牛系统安装DataEase自定义Docker包
运维·docker·容器
ん贤14 分钟前
GMP模型
运维·服务器·后端·golang
abbgogo16 分钟前
子域名收集和c段查询
运维·服务器·信息收集
NicolasCage16 分钟前
java 项目服务器部署
运维·自动化运维
杜子不疼.21 分钟前
Linux的生态与软件安装
linux·运维·服务器
哈基咩38 分钟前
Go语言unsafe包深度解析
服务器·开发语言·后端·golang
wanhengidc1 小时前
服务器被网络攻击后该如何进行处理?
运维·服务器·网络
MickeyCV1 小时前
MySQL数据库本地迁移到云端完整教程
服务器·数据库·mysql·oracle
Tipriest_2 小时前
离线进行apt安装的过程(在只能本地传输的ubuntu主机上使用apt安装)
linux·运维·ubuntu·apt·install·deb