文章目录
  1. 1. 正则
    1. 1.1. grep [-ivn][-A/Bn] ‘keyword’
      1. 1.1.1. 行相关
      2. 1.1.2. 模糊查询[]
      3. 1.1.3. 反向查找[^]
      4. 1.1.4. 行-首尾^$
      5. 1.1.5. 字符匹配. * +
        1. 1.1.5.1. . 匹配任意一个字符
        2. 1.1.5.2. * 匹配0次以上
        3. 1.1.5.3. + 匹配1次以上 需要转义= =
      6. 1.1.6. 连续字符范围限定{m,n} 需要转义
    2. 1.2. sed [-nefr] action
      1. 1.2.1. action === [n1[,n2]] function
    3. 1.3. 栗子
      1. 1.3.1. 增 删 替换
      2. 1.3.2. 显示
      3. 1.3.3. !批量替换!
        1. 1.3.3.1. vim的批量替换
    4. 1.4. egrep(expand grep)
  2. 2. 格式化输出
    1. 2.1. 排版printf
    2. 2.2. awk ‘[conditions]{actions}’ filename
      1. 2.2.1. attention
      2. 2.2.2. 对比sed
      3. 2.2.3. 栗子
  3. 3. Reference

正则

主要以栗子为主

grep [-ivn][-A/Bn] ‘keyword’

行相关

0x1 查找内核中有 eth 字样的行数据,显示行号,额外再显示选中行前(befor)3行和后(after)2行的数据

dmesg | grep -n -B3 -A2 ‘eth’

模糊查询[]

0x1 不区分test和taste单词

grep -n ‘t[ae]st’ testfile

反向查找[^]

0x1 找首字母不是元音的单词所在的行号
可以自行去找个测试网站尝试(\s过滤无用空格避免错误判断)

grep -in ‘\b[^aeiou\s][a-z]+\b’ /var/log/kern.log.1

这里自作聪明用()把[a-z]+给框了起来,然后就识别不出来

—-后记: 发现小括号也需要转义!!= =

行-首尾^$

^区别于上面的^,位置不同
0x1 查找二月份的内核日志

grep -in ‘^Feb’ /var/log/kern.log.1

0x2 查找以.作为结尾的数据(.本身存在option含义,需要转义)
$在linux中是换行结尾符,windows则为^M$

grep -n ‘.$’ /var/log/kern.log.1

0x3 查找空白行(^$首尾相接)

grep -n ‘^$’ ./tmp/testfile

字符匹配. * +

. 匹配任意一个字符

0x1 匹配 l??d

grep -n ‘l..d’ /var/log/kern.log.1

该文件可以匹配到called load等单词

* 匹配0次以上

0x2 .*的组合表示匹配任意数量字符

grep -n ‘e.*e’ /var/log/kern.log.1

这种情况在两个e之间碰到e不会停下,直到找到最后一个e,形成最长字串

+ 匹配1次以上 需要转义= =

0x3 匹配e/ee/eee/e….

grep -n ‘e+‘ /var/log/kern.log.1

连续字符范围限定{m,n} 需要转义

m,n可以省略其一
0x1 仅匹配一个er

grep -n ‘(er){1}‘ testfile

0x2 匹配2个以上er

grep -n ‘(er){2,}‘ testfile

这里有一种情况:ererer在{2,}的选择下是一个整体,即{}会自动匹配最高重复数

sed [-nefr] action

-n silent模式,只出现被处理的那行
-e edit -f 将sed动作写入file
-r 扩展型regex -i直接修改文件内容

action === [n1[,n2]] function

所有动作的最小单位均为
function:
-a add -c 替换 -d delete
-i insert -p print -s 替换,可用正则 加上标题的行号就可以进行批量替换啦~

栗子

增 删 替换

0x1 /etc/passwd删除2-5行并打印(含行号nl)

nl /etc/passwd | sed ‘2,5d’

0x2 在3-5行前/后换行新添’next’字符串(参照vim)

nl /etc/passwd | sed ‘3,5[i/a] next’

0x3 将1-4行全部替换为’next’

nl /etc/passwd | sed ‘1,4c next’

显示

0x1 只显示2-6行内容
-n 经过处理的

nl /etc/passwd | sed -n ‘2,6p’

!批量替换!

语法: s/word1/word2/g' g可选globe`全局概念
0x1 在ifconfig中将ip截取出来

选行->除首->除尾
ifconfig wlan0 | grep -n ‘192.168’ | sed ‘s/^.ddr://g’ | sed ‘s/\s..0$//g’

vim的批量替换

0x1 当前行替换

:s/XXX/YYY/g

0x2 行范围替换

:100, 102s/XXX/YYY/g

0x3 全局替换

%s/XXX/YYY/g

egrep(expand grep)

(感觉以后还是直接alias grep=egrep好一点)
X+ 1个或以上X X?0或一个X |
() 分组 ()+ 多个重复组判别
小李子:

cat /etc/passwd | egrep -n “^c|^s”

(nl居然连grep基本的^都不能用…)

格式化输出

排版printf

printf ‘%s\n’ $(nl /etc/passwd)
printf ‘\x55\n’

awk ‘[conditions]{actions}’ filename

attention

$0 整行 行内:$1 $2 $3 为第n个连续
NF 每行的字段总数 NR:目前处理的行号(row) FS:文件分隔符(split)
所有动作需要""括住
运算符==表示等于

对比sed

相对于sed的行处理,sed主要将数据变为多个字段进行处理

栗子

0x1 取出最近3个账号及登陆IP last -i显示ip

last -in 3
[email protected]:~$ last -in 5 | awk ‘{printf $1 “\t” $3”\n”}’

a1exlism 0.0.0.0
a1exlism 0.0.0.0
a1exlism 0.0.0.0
wtmp Mon

0x2 NR NF实践-列出所处理的行列号

last -n 5 | awk ‘{printf $1 “\t lines:” NR “\t columns: “ NF”\n”}’

0x3 awk内部重定向和NS实践-打印以:分割数据后第三大字段中大于5的第二个小字段

cat /etc/passwd | awk ‘{FS “:”} $3 > 5 {printf $2 “\n”}’

0x4 awk预置变量(保证第一行数据正确地被执行)

cat /etc/passwd | awk ‘BEGIN {FS “:”} $3 > 5 {printf $2 “\n”}’

0x5 awk的计算功能
计算不写了

Reference

《鸟哥私房菜》

文章目录
  1. 1. 正则
    1. 1.1. grep [-ivn][-A/Bn] ‘keyword’
      1. 1.1.1. 行相关
      2. 1.1.2. 模糊查询[]
      3. 1.1.3. 反向查找[^]
      4. 1.1.4. 行-首尾^$
      5. 1.1.5. 字符匹配. * +
        1. 1.1.5.1. . 匹配任意一个字符
        2. 1.1.5.2. * 匹配0次以上
        3. 1.1.5.3. + 匹配1次以上 需要转义= =
      6. 1.1.6. 连续字符范围限定{m,n} 需要转义
    2. 1.2. sed [-nefr] action
      1. 1.2.1. action === [n1[,n2]] function
    3. 1.3. 栗子
      1. 1.3.1. 增 删 替换
      2. 1.3.2. 显示
      3. 1.3.3. !批量替换!
        1. 1.3.3.1. vim的批量替换
    4. 1.4. egrep(expand grep)
  2. 2. 格式化输出
    1. 2.1. 排版printf
    2. 2.2. awk ‘[conditions]{actions}’ filename
      1. 2.2.1. attention
      2. 2.2.2. 对比sed
      3. 2.2.3. 栗子
  3. 3. Reference