(九)Shell工具:awk,sort,cut,sed

九、Shell工具

1. cut

cut:的工作就是剪,具体说就是从文件中剪切出想要的数据。

cut的原理:从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。

基本语法

cut [选项] filename

选项:

  • -f:列号,提取第几列
  • -d:分隔符,按照制定分隔符分割列,默认分隔符是制表符

案例实操

cut.txt如下

kivelson sang
valentina Son
david wang
zhimin liu
  • 从cut.txt中剪切第2列
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % cut -f 2  -d " " cut.txt
sang
Son
wang
liu
  • 从cut.txt中剪切第2列和第三列
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % cut -f 1,2,3 -d " " cut.txt
kivelson sang
valentina Son
david wang
zhimin liu
  • 从cut.txt中剪切出kivelson
sangxiaoqian@MBP HelloShell % cat cut.txt | grep kivelson | cut -f 1 -d " " 
kivelson
  • 截取系统path变量值,第2个 ":" 后的所有路径
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % echo $PATH | cut -f 3- -d ":" 
/bin:/usr/sbin:/sbin
  • 切割ifconfig打印的ip地址
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % ifconfig en0
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	options=6463<RXCSUM,TXCSUM,TSO4,TSO6,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM>
	ether f4:d4:88:89:f6:ff 
	inet6 fe80::1892:2ecb:ef9f:d67f%en0 prefixlen 64 secured scopeid 0xf 
	inet 172.19.196.153 netmask 0xfffff000 broadcast 172.19.207.255
	nd6 options=201<PERFORMNUD,DAD>
	media: autoselect
	status: active
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % ifconfig en0 | grep inet | cut -d " " -f 2
fe80::1892:2ecb:ef9f:d67f%en0
172.19.196.153

2. sed

sed是用于编辑文本内容的流编辑器,它一次只能处理一行内容。

原理:处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

基于语法

sed [选项参数] ”命令“ filename: mac下用gsed代替sed

brew install gnu-sed
alias sed=gsed
选项 功能
-e 命令集模式
命令 功能
a 在下一行新增
d 删除
s 查找并替换

案例实操

cut.txt如下

kivelson sang
valentina Son
david wang
zhimin liu
wo wo
  • 在Valentina Son下插入”mei lv“, 源文件不改变
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % sed "2a mei lv" cut.txt 
kivelson sang
valentina Son
mei lv
david wang
zhimin liu
  • 删除sed.txt文件中所有包含wo的行
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % sed "/wo/d" cut.txt 
kivelson sang
valentina Son
david wang
zhimin liu

  • 将cut.txt文件中wo替换为ni
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % sed "s/wo/ni/g" cut.txt 
kivelson sang
valentina Son
david wang
zhimin liu
ni ni

g代表全局替换

  • 将sed.txt文件中第二行删除, 并将wo替换我ni
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % sed -e "2d" -e "s/wo/ni/g" cut.txt 
kivelson sang
david wang
zhimin liu
ni ni

3. awk

awk是一个强大的文本分析工具,把文件逐行读入,以空格为默认分隔符将每行切片,再对切片进行分析处理。

awk[选项] 'pattern1{action1} pattern2{action2}...' filename:

  • pattern: 正则表达式,用于在awk数据中查找内容。

  • action:在找到匹配内容时执行一系列命令。

  • 选项:

选项 功能
-F 指定输入文件拆分分隔符
-v 赋值一个用户定义变量
  • 内置变量
变量 功能
FILENAME 文件名
NR 已读的记录数(行号)
NF 切割后,列的个数

案例实操

拷贝/etc/passwd到当前目录,并改变文件所属用户为当前用户

sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % sudo cp /etc/passwd ./
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % sudo chown sangxiaoqian:staff ./passwd 
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % cat passwd
nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
_uucp:*:4:4:Unix to Unix Copy Protocol:/var/spool/uucp:/usr/sbin/uucico
_taskgated:*:13:13:Task Gate Daemon:/var/empty:/usr/bin/false
_networkd:*:24:24:Network Services:/var/networkd:/usr/bin/false
_installassistant:*:25:25:Install Assistant:/var/empty:/usr/bin/false
_lp:*:26:26:Printing Services:/var/spool/cups:/usr/bin/false
  • 搜索passwd文件中,以root开头的所有行,并输出该行的第七列
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % awk -F ":" '/^root/{print $7}' passwd 
/bin/sh
  • 搜索passwd文件中,以root开头的所有行,并输出该行的第1列和第7列,以,分隔(默认以宫格分隔)
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % awk -F ":" '/^root/{print $1","$7}' passwd
root,/bin/sh
  • 只显示/etc/passwd的第1列和第7列,以逗号分隔,在第1行前添加用户名,在最后一行后添加“hahaha”
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % awk -F ":" 'BEGIN{print "sangxiaoqian"} {print $1","$7} END{print "hahaha"}' passwd 
username
nobody,/usr/bin/false
root,/bin/sh
daemon,/usr/bin/false
_uucp,/usr/sbin/uucico
_taskgated,/usr/bin/false
_networkd,/usr/bin/false
_installassistant,/usr/bin/false
_lp,/usr/bin/false
hahaha
  • 将所有用户id+1,并输出
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % awk -F : '{print $3+1}' myPass.txt 
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % awk -F : -v i=1 '{print $3+i}' myPass.txt 
  • 统计passwd文件名,每行的行号,每行的列数
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % awk -F : '{print NR" "FILENAME": "NF}' myPass.txt
1 myPass.txt: 7
2 myPass.txt: 7
3 myPass.txt: 7
4 myPass.txt: 7
5 myPass.txt: 7
6 myPass.txt: 7
  • 切割IP

IP如下:

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	options=6463<RXCSUM,TXCSUM,TSO4,TSO6,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM>
	ether f4:d4:88:89:f6:ff 
	inet6 fe80::1892:2ecb:ef9f:d67f%en0 prefixlen 64 secured scopeid 0xf 
	inet 172.19.196.153 netmask 0xfffff000 broadcast 172.19.207.255

切割IP:

sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % ifconfig en0 | grep inet | cut -f 2 -d " " | sed "1d" | awk -F "." '{print $1,$2,$3,$4}'
172 19 196 153

sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % ifconfig en0 | grep inet | cut -f 2 -d " " | sed "1d"
172.19.196.153

  • 查询cut.txt中空行所在的行号
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % awk '/^$/{print NR}' cut.txt

4. sort——排序

sort (选项)(参数): 按照制定规则进行排序

选项 说明
-n 按照数值大小排序
-r 按照相反顺序排序
-t 列分隔字符
-k 制定需要排序的列
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % sort -t : -k 2 -nr sort.txt 
xz:50:2.3
ss:30:1.6
bb:30:5.4
db:20:4.2
cls:10:3.5
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % sort -t : -k 2 -n sort.txt 
cls:10:3.5
db:20:4.2
bb:30:5.4
ss:30:1.6
xz:50:2.3
posted @ 2022-08-24 15:49  言思宁  阅读(83)  评论(0编辑  收藏  举报