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

五.总结

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

相关推荐
上海云盾第一敬业销售1 小时前
API面临哪些风险,如何做好API安全?
服务器·网络·安全
忘了ʷºᵇₐ1 小时前
MapReduce-WordCount实现按照value降序排序、字符小写、识别不同标点
java·大数据·linux·intellij-idea·mapreduce
海天胜景2 小时前
VSCode launch.json 配置参数详解
linux·vscode·json
deepwater_zone2 小时前
Linux下 使用 SSH 完成 Git 绑定 GitHub
linux·git·ssh
zhangxzq3 小时前
JVM 性能问题排查实战10连击
java·运维·jvm·经验分享·docker
惜.己4 小时前
Linux Shell编程(四)
linux·运维·服务器
w3296362714 小时前
ubuntu open shh9.9安装
linux·服务器·ubuntu
JANYI20184 小时前
C语言经典面试题及答案100道
linux·c语言·c++·算法·ubuntu·面试
love530love5 小时前
【笔记】PyCharm 中创建Poetry解释器
运维·人工智能·windows·笔记·python·pycharm·conda