head /etc/passwd | awk -v FS=
":"
-v OFS=
"\t"
'{print $1,$2,$(NF-1),$NF}'
(2)按照列的特征筛选行
#第四列值大于0的行
#比较下面两个命令的差异,$0表示原文件的行内容
head /etc/passwd | awk -v FS=":" -v OFS="\t" '$4 > 0{print $0}'
head /etc/passwd | awk -v FS=":" -v OFS="\t" '$4 > 0{print $1,$2,$4}'
#第六列值内容为 "/sbin"的行
head /etc/passwd | awk -v FS=":" -v OFS="\t" '$6 == "/sbin" {print $1,$2,$6}'
#最后一列值内容包含 "nologin"的行
head /etc/passwd | awk -v FS=":" -v OFS="\t" '$NF ~ nologin {print $1,$2,$NF}'
## 可使用 && || 将多个筛选条件结合起来进行筛选
## 还有更多更复杂的筛选方法,具体需要用到时在做学习
4、cut#
(1)截取每行指定位置的字符(串)
#截取第3个字符
who | cut -b 3
#截取第3,4,5,7个字符串
who | cut -b 3-5,7
#截取第3个字符至末尾的字符串
who | cut -b 3-
(2)指定分隔符(-d),取指定片段的字符串(-f)
##只能指定单个字符为分隔符
#以冒号为分隔符,取第一列
head /etc/passwd | cut -d : -f 1
#以冒号为分割符,取第2,4,6列
head /etc/passwd | cut -d : -f 2,4-6
#以单个空格为分隔符
who | cut -d ' ' -f 1
##cut默认制表符为分隔符。可使用sed语句判断不确定的空白是制表符还是空格
printf 'a b\n' | sed -n l
printf 'a\tb\n' | sed -n l
printf 'a\tb\n' | cut -f 1
5、sort#
主要功能:对单列字符串排序
head /etc/passwd | cut -d : -f 1 | sort
# -r 逆序
head /etc/passwd | cut -d : -f 1 | sort -r
# -u 去重
who | cut -d ' ' -f 1 | sort -u
# -n 按数值排序
head /etc/passwd | cut -d : -f 4 | sort -n
#按照某一列(-t指定分隔符)顺序调整每行的顺序;输出仍为行文本内容
head /etc/passwd | sort -n -t ':' -k 4
6、uniq#
主要功能:搭配sort
计算频率
#uniq只会对相邻的重复值进行去重处理
head /etc/passwd | cut -d : -f 4 | uniq
head /etc/passwd | cut -d : -f 4 | sort | uniq
# -c 统计频数
head /etc/passwd | cut -d : -f 4 | sort | uniq -c
#按频数排序
head /etc/passwd | cut -d : -f 4 | sort | uniq -c | sort -n
# -d 只显示有重复的行
head /etc/passwd | cut -d : -f 4 | sort | uniq -dc
7、tr#
主要功能:单个字符一一替换
who | tr 'abc' '123'
who | tr 'a-z' 'A-Z'
#替换分隔符
head /etc/passwd | tr ':' ','
head /etc/passwd | tr ':' '\t'
#单个字符删除 -d
who | tr -d 'a-z'
who | tr -d 'a'
8、cat,paste,join#
cat:纵向合并文件
cat f1.txt f2.txt > f3.txt
paste:横向合并文件
paste f1.txt f2.txt
# -d 可指定分隔符
paste -d ',' f1.txt f2.txt
#每两行合并为一行,以制表符为分隔符
cat f1.txt | paste - -
此外 join 可按公共列纵向合并文件。类似R中join
系列函数