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 # 找出开头不是#号的行数据

  1. $ 表示搜索以什么结尾。

root@localhost \~# grep 'ol$' test.txt # 找出结尾为ol字母的行数据

  1. ^$ 表示空行,不是空格。

root@localhost \~# grep '^$' test.txt # 找出所有的空白行。

root@localhost \~# grep -v '^$' test.txt # 找出所有的非空白行数据,如果保存一下, 那么相当于快速删除所有空行。

sed删除空行,更容易,因为它更擅长修改文件内容

root@localhost \~# sed '/^$/d' test.txt # 加上-i就改了原文件

  1. . 代表且只能代表任意一个字符。跟癞子斗地主中的癞子一样。

root@localhost \~# grep '.dp' test.txt # 找出xdp,x可以是任意一个字符,注意,是一 个!

  1. \ 转义字符,让有着特殊身份意义的字符,脱掉马甲,还原原型。

例如:\.只表示小数点,还原原始小数点的意义。

root@localhost \~# grep '\.ia' test.txt # 这就表示,找到含有.dp的行数据

  1. * 重复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

  1. .* 匹配所有的字符。^.* 任意多个字符开头。

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

  1. abc 匹配字符集合内任意一个字符a-z0-9A-Z,多选一,0,9这个是2选1. root@localhost \~# grep -E '0-9' serv

root@localhost \~# grep -E '0,9' serv

  1. \^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 # 不要字母和数字

  1. {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 sshd16905: 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 "

(250-5|20-4\d|0-1\d{2}|1-9?\d)\.(250-5|20-4\d|0-1\d{2}|1-9?\d)\.

(250-5|20-4\d|0-1\d{2}|1-9?\d)\.(250-5|20-4\d|0-1\d{2}|1-9?\d)"

Mar 25 18:20:48 localhost sshd16905: 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 "

(250-5|20-4\d|0-1\d{2}|1-9?\d)\.(250-5|20-4\d|0-1\d{2}|1-9?\d)\.

(250-5|20-4\d|0-1\d{2}|1-9?\d)\.(250-5|20-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 "

(250-5|20-4\d|0-1\d{2}|1-9?\d)\.(250-5|20-4\d|0-1\d{2}|1-9?\d)\.

(250-5|20-4\d|0-1\d{2}|1-9?\d)\.(250-5|20-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 sshd16905: Failed password for root from

192.168.61.1 port 55577 ssh2

Mar 25 18:49:26 localhost sshd1498: 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

五.总结

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

相关推荐
AOwhisky12 分钟前
Linux(CentOS)系统管理入门笔记(第四期)——文件系统(下篇):文件与目录操作实战——cpmvmkdirrmln
linux·运维·笔记·centos·云计算·文件系统
岑梓铭33 分钟前
考研408《操作系统》复习笔记,第四章《4.2.2 文件操作、文件共享、文件保护》
linux·考研·操作系统·文件系统·408
Mr.HeBoYan40 分钟前
DPDK为什么越来越少使用rte_ring?——从Lock-Free到Run-to-Completion,重新理解现代DPDK架构演进(上)
linux·网络·算法·性能优化·架构·dpdk
XTIOT6661 小时前
CRPT 诚实标识采集落地技术实践:分工况硬件选型与合规数据标准化解决方案
大数据·运维·人工智能·嵌入式硬件·物联网
云栖梦泽2 小时前
从 IMX415 摄像头驱动理解 Media Controller 框架
linux·开发语言·c++·嵌入式硬件
纳兰青华2 小时前
CentOS Stream 9 下载与安装完全指南:为什么它是当前最稳妥的选择?
linux
白白白飘2 小时前
【8】补充与拓展:Langchain的联网搜索Agent,使用Tavily工具
服务器·网络·langchain
草邦设计开发团队_媒体资源平台2 小时前
Linux 稳定常驻启动 PHP 队列,服务器重启自动恢复
linux·服务器·php·队列执行
想你依然心痛2 小时前
嵌入式容器:Docker与BalenaOS在边缘设备上的实践——容器运行时与OTA
运维·docker·容器
竣达技术2 小时前
NAS / 服务器断电数据丢失?UPS 配套 USB关机保护板,市电断电池低自动提示服务器/电脑关机
运维·服务器·电脑