$> cat user.txt
01, zhang, M, 18
02, wang, M, 20
03, li, M, 21
# 以","分隔,显示第二列
$> cut -d "," -f 2 user.txt
zhang
wang
li
# 以","分隔,显示第1列和第3列
$> cut -d "," -f 1,3 user.txt
01, M,
02, M,
03, M,
# 以","分隔,显示第1-3列
$> cut -d "," -f 1-3 user.txt
01, zhang, M,
02, wang, M,
03, li, M,
# 以","分隔,显示除第1列以外的其他列
$> cut -d "," -f 1 --complement user.txt
zhang, M, 18
wang, M, 20
li, M, 21
## 注意前面是有空格的!
###### 字符串
$> cut -c1-5 user.txt
01, zh
02, wa
03, li
printf %s 1 2 3 4 5 6 # 把123456当成一个字符串输出,没有格式
printf %s %s %s 1 2 3 4 5 6 # 把%s%s123456当做字符串输出,没有格式
printf '%s ' 1 2 3 4 5 6 # 把1 2 3 4 5 6当做字符串输出,输出格式为空格
printf '%s\n' 1 2 3 4 5 6 # 输出格式为1个一行
printf '%s %s %s' 1 2 3 4 5 6 # 把内容当做字符串三个为一组输出,1 2 34 5 6
printf '%s %s %s\n' 1 2 3 4 5 6 # 输出格式为3个一行
printf '%s' $(cat user.txt) # 输出文本内容为字符串
printf '%s\t %s\t %s\t %s\n' $(cat user.txt) # 把文本内容格式化输出
awk ‘条件1{动作1} 条件2{动作2} …’ 文件名
( 如果条件1,执行动作1;如果条件2,执行动作2 )
# 大括号前面没有条件,直接执行命令,这里的printf 是awk的命令,$2 提取文件第二列,$3 提取文件第三列,$0 提取所有列
awk '{printf $2 "\t" $3"\n"}' user.txt
# 打印三列,这里的print是awk的命令,系统并没有print命令,所以只能在awk里使用;与printf的区别是:print会自动在行尾加换行符,而printf不会
df -h | awk '{print $1 "\t" $5 "\t" $6 "\t"}'
# 提取系统已使用硬盘空间,可以把结果赋给一个变量,判断是否大于某个值,进行报警
df -h | grep sda3 | awk '{print $5}' | cut -d '%' -f 1
# 查看剩余内存不包含单位M
free -h | grep Mem | awk '{print $4}' | cut -d 'M' -f 1
awk 'BEGIN{print "this is a text"} {print $2 "\t" $3}' user.txt
awk 'BEGIN{FS=":"} END{print "this is end text"} {print $1 "\t" $3}' /etc/passwd
关系运算符:
# user.txt中不包含ID这行,提取满足条件为第四列值大于18的第二列
cat user.txt | grep -v ID | awk '$4 > 18 {printf $2 "\n"}'
sed主要是用来将数据进行选取、替换、删除、新增的命令。可以放在管道符之后处理。
sed -n '2p' user.txt # 输出第二行, p一般都要和-n使用,不-n会显示出所有的行
df -h | sed -n '2p' # 管道符结果作为操作内容
sed '2,4d' user.txt # 删除文件的第2行到第4行,显示剩下的行,没有加 i 选项,不会更改文件内容
sed '2a hello' user.txt # 在第二行后追加hello,仅仅修改命令输出
sed '2i hello \
world' user.txt # 在第二行前插入两行数据,仅仅修改命令输出
sed '2c No person' user.txt # 把第二行替换为No person
sed '2s/M/F/g' user.txt # 把第二行的M替换为F后输出
sed -i '2s/M/F/g' user.txt # 把替换后的结果写入文件
sed -e 's/zhang//g ; s/wang//g' user.txt # -e 允许多条命令顺序执行,用分号隔开,s前面不加数字表示所有行