Linux sed 和 awk 的用法
sed
sed [-nefri] [操作]
常用选项:
- -n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
- -e∶直接在指令列模式上进行 sed 的动作编辑;
- -f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
- -r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
- -i∶直接修改读取的档案内容,而不是由萤幕输出。
常用命令:
- a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
- c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
- d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
- i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
- p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
- s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
范例: 将/etc/passwd 中内容打印 并 显示行号,同时删除2~5行
nl /etc/passwd | sed '2,5d'
d 是 删除操作若要删除到最后一行 则是
nl /etc/passwd | sed '2,$d'
若是 要在第二行 后添加
nl /etc/passwd | sed '2a drink tea'
2: 行号 a: 添加
nl /etc/passwd | sed '2i drink tea'
在第二行 前插入 drink tea整行替换
nl /etc/passwd | sed '2,5c drink tea'
第二行至第五行 替换为 drink tea列出 10~20行
head -n 20 | tail -n 10
可用sed替换nl /etc/passwd | sed '2,5p'
2~5行重复。 使用 -n 安静模式nl /etc/passwd | sed -n '2,5p'
sed 还可以以行为单位进行部分数据查找替换
sed 's/要被替换字符/新的字符/g'
筛选IP:
ip addr | grep 'scope host lo' | sed 's/inet //g' | sed 's/\/.*//g
危险操作 直接修改文件
nl /etc/passwd > test.txt # 将数据重定向到test.txt
sed -i '$a drink tea' test.txt # 在 test.txt 文件后追加文本
awk 好用的数据处理工具(简单用法)
awk 是一个非常棒的数据处理工具,相较于sed常常作用于一整行的操作,awk比较倾向于一行当中分成数个字段来处理。 ---by 鸟哥
awk 通常运行模式是 awk '条件类型1 {操作1} 条件类型2{操作2}...' filename
awk 主要是处理每一行的字段内的数据,而默认的字段分隔符为空格键或TAB键。
last -n 5 # 取出前5行
读取出ip 账户名
last -n 5 | awk '{print $1 "\t" $3}'
在awk 的括号内,每一行的每个字段都是由变量名称,那就是$1,$2等变量名称。
$0 代表【一整列数据】 即全部数据
awk 的内置变量
变量名称 | 代表意义 |
---|---|
NF | 每一行$0 所拥有的总字段数 |
NR | 目前awk 所处理的第几行数据* |
FS | 目前的分割字符,默认是空格键。 |
awk 所有操作是单引号 '
括住的
last -n t | awk '{print $1 "\t lines: " NR "\t columns: " NF}'
awk 逻辑运算字符
运算单元 | 代表意义 |
---|---|
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
假设 要查看/etc/passwd 第三栏小于10一下的数据 并且仅列出账号与第三列
cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t " $3}' # 除第一行外都成功
cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}' # 使用BEGIN 关键词, 还有END关键词。
awk 还可以帮助我们完成循环计算 这里不多赘述。