Linux数据提取命令
Linux数据提取命令
cut
简介
数据切分
语法
cut OPTION [FILE]
使用说明
从标准输入或者文件数据的每一行出入中切分字节、字符或字段并这些字节、字符和字段打印至标准输出,如果不指定FILE参数,
cut命令将读取标准输入。必须制定-b、-c或-f标志之一
常用参数:
* -b:以字节为单位进行分割。
* -c:以字符为单位进行分割
* -d:自定义分割符,默认为制表符
* -f:与-d一起使用,指定显示哪个区域
例子
特殊说明
1)#号后面是注释,不是命令,不要在Linux下运行
ydqun@VM-0-9-ubuntu cut % cat cut.txt
123 456 789 abc def ghi
ydqun@VM-0-9-ubuntu cut % cat cut.txt | cut -d " " -f 1 #以空格为分割符,切分后取第一个分割的字符段
123
ydqun@VM-0-9-ubuntu cut % cat cut.txt | cut -d " " -f 2 #以空格为分割符,切分后取第二个分割的字符段
456
ydqun@VM-0-9-ubuntu cut % cat cut.txt | cut -b 5-7 #以字节为单位进行分割,提取第5-7个字节的字符段
456
ydqun@VM-0-9-ubuntu cut % cat cut.txt | cut -c 5-7 #以字符为单位进行分割,提取第5-7个字节的字符段
456
ydqun@VM-0-9-ubuntu cut %
tr
简介
用于转换或阐述文件中或标准输入中的字符
语法
tr [-cdst][--help][--version][第一字符集][第二字符集]
tr [OPTION]…SET1[SET2]
使用说明
Linux tr 命令用于转换或删除文件中的字符。
tr 指令从标准输入设备读取数据,经过字符串转译后,将结果输出到标准输出设备。
常用参数说明
* -c, --complement:反选设定字符。符合SET1字符集的字符不做处理,不符合的剩余部分才进行转换
* -d, --delete: 删除指令字符
* -s, --squeeze-repeats:缩减连续重复的字符成指定的单个字符
* -t, --truncate-set1:删除第一个字符集中较第二个字符集多出来的字符
例子
特殊说明
1)#号后面是注释,不是命令,不要在Linux下运行
例子
ydqun@VM-0-9-ubuntu cut % echo "123 456 abcdefg 789 aa"
123 456 abcdefg 789 aa
ydqun@VM-0-9-ubuntu cut % echo "123 456 abcdefg 789 aa" | tr "a-z" " " #不用OPTION 直接把小写字母全部替换成空格字符,即第一字符集[a-z]转换成第二字符集[ ]
123 456 789
ydqun@VM-0-9-ubuntu cut % echo "123 456 abcdefg 789 aa" | tr -c "0-9" " " #用-c选项 把非数字的字符全部替换成空格字符,即非第一字符集[0-9]转换成第二字符集[ ],但是发现多了一个%,这是因为把换行符给转换了
123 456 789 %
ydqun@VM-0-9-ubuntu cut % echo "123 456 abcdefg 789 aa" | tr -c "0-9\n" " " #在第一字符集上加上\n,就可以解决
123 456 789
ydqun@VM-0-9-ubuntu cut % echo "123 456 abcdefg 789 aa" | tr -c "0-9" " " | tr -s " " #用-s " ",压缩多余的空格字符
123 456 789 %
ydqun@VM-0-9-ubuntu cut % echo "123 456 abcdefg 789 aa" | tr -c "0-9" " " | tr -s " " | tr " " "\n" #不加[OPTION],把第一字符集的字符替换成第二字符集
123
456
789
grep
简介
Linux grep 命令用于查找文件里符合条件的字符串。
语法
grep [-acinv]
常用参数说明
* -a: 将二进制文件以普通文件的形式搜索数据
* -c: 统计搜寻到的次数
* -i:忽略大小写
* -n: 顺序输出行号
* -v: 不包含string的内容输出
使用说明
grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。
特殊说明
1)#号后面是注释,不是命令,不要在Linux下运行
例子
ydqun@VM-0-9-ubuntu cut % cat grep.txt
ydqun 1 111
YDQUN 2 222
haha 3 444
ydqun@VM-0-9-ubuntu cut % grep "ydqun" grep.txt #在文件grep.txt种查找带有ydqun字符串的一行数据
ydqun 1 111
ydqun@VM-0-9-ubuntu cut % grep "ydqun" grep.txt -i #忽略大小写
ydqun 1 111
YDQUN 2 222
ydqun@VM-0-9-ubuntu cut % grep "ydqun" grep.txt -i -v #搜索除了YDQUN和ydqun之外的数据行
haha 3 444
ydqun@VM-0-9-ubuntu cut % grep "ydqun" -i -c grep.txt #统计不分大小写的ydqun字符串出现的行数
2
sort
简介
Linux sort命令用于将文本文件内容加以排序
语法
sort [-fbMnrtuk]<file_or_stdio>
常用参数说明
* -f: 忽略大小写
* -b: 忽略前面的空格符
* -M: 以月份名称排序
* -n: 以纯数字方式排序
* -r: 反向排序
* -u: uniq 去重
* -t: 分割符,默认[TAB](制表符)
* -k: 以哪个区间排序
使用说明
sort可针对文本文件的内容,以行为单位来排序。
特殊说明
1)#号后面是注释,不是命令,不要在Linux下运行
例子
计算机期末考成绩出来了,计算机老师教给zhangsan一个任务,帮忙帮他整理一下这个成绩文件,假设以下是某个班的所有同学计算机学科的成绩的文件grade.txt,有顺序的输出这个成绩文件里的内容,其中登记成绩时,有一位同学的成绩重复登记。
ydqun@VM-0-9-ubuntu cut % cat grade.txt
zhangsan 80
lisi 76
wangwu 90
zhaoliu 87
sunqi 79
zhouba 88
wujiu 100
zhaoliu 87
1.按照名字字母的顺序排序,并去掉重复登记的同学的成绩记录
ydqun@VM-0-9-ubuntu cut % sort grade.txt -u
lisi 76
sunqi 79
wangwu 90
wujiu 100
zhangsan 80
zhaoliu 87
zhouba 88
2.按照成绩排名,成绩高的在前面
ydqun@VM-0-9-ubuntu cut % sort grade.txt -t " " -k 2 -u #以空格为分割符,去分割后的第二个字段作为排序,发现100排在前面
wujiu 100
lisi 76
sunqi 79
zhangsan 80
zhaoliu 87
zhouba 88
wangwu 90
ydqun@VM-0-9-ubuntu cut % sort grade.txt -t " " -k 2 -u -n #加上-n,就可以用数字去排序,而不是第一个字符的ASCII值去排序
lisi 76
sunqi 79
zhangsan 80
zhaoliu 87
zhouba 88
wangwu 90
wujiu 100
ydqun@VM-0-9-ubuntu cut % sort grade.txt -t " " -k 2 -u -n -r #加上-r,实现成绩高的在前面
wujiu 100
wangwu 90
zhouba 88
zhaoliu 87
zhangsan 80
sunqi 79
lisi 76
wc
简介
Linux wc命令用于统计字符,字数,行数
语法
wc [-lwm] <file_or_stdin>
常用参数说明
* -l: 仅列出行号
* -w: 仅列出多少字
* -M: 仅列出多少字符
使用说明
利用wc指令我们可以计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为"-",则wc指令会从标准输入设备读取数据。
特殊说明
1)#号后面是注释,不是命令,不要在Linux下运行
例子
有一篇英语文章,我们来统计它的行号,字数和字符数
ydqun@VM-0-9-ubuntu cut % cat article.txt
A man was going to the house of some rich person.As he went along the road,he saw a box of good apples at the side of the road.He said,"I do not want to
eat those apples; for the rich man will give me much food; he will give me very nice food to eat." Then he took the apples and threw them away into the
dust.He went on and came to a river.The river had become very big; so he could not go over it.He waited for some time; then he said,"I cannot go to the
rich man's house today,for I cannot get over the river."He began to go home.He had eaten no food that day.He began to want food.He came to the apples,
and he was glad to take them out of the dust and eat them. Do not throw good things away; you may be glad to have them at some other time.
#直接不输入参数,结果为5行,155个单词,共749个字符
ydqun@VM-0-9-ubuntu cut % wc article.txt
5 155 749 article.txt
#加-l只统计有多少行
ydqun@VM-0-9-ubuntu cut % wc -l article.txt
5 article.txt
#加-w统计有多少个单词
ydqun@VM-0-9-ubuntu cut % wc -w article.txt
155 article.txt
#加-c统计有多少个字符
ydqun@VM-0-9-ubuntu cut % wc -c article.txt
749 article.txt
uniq
简介
Linux uniq命令用于文本文件中重复出现的行列
语法
uniq [-cdiu]
常用参数说明
* -c 或 --count: 在每行旁边显示该行重复出现的次数
* -d 或 --repeated: 仅显示重复出现的行列
* -i 或 --ignore-case: 忽略大小写
* -u 或 --unique: 仅显示不重复的行
使用说明
Linux uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。
特殊说明
1)#号后面是注释,不是命令,不要在Linux下运行
例子
假设有个成绩表格文件uniq.txt,里面有很多重复成绩项,我们去处理它。
ydqun@VM-0-9-ubuntu cut % cat uniq.txt
zhangsan 30
zhangsan 30
lisi 40
lisi 40
wangwu 50
zhaoliu 60
zhaoliu 60
zhaoliu 60
sunqi 70
zhouba 80
zhouba 80
wujiu 90
wujiu 90
wujiu 90
wujiu 90
#不带任何参数直接去除重复项
ydqun@VM-0-9-ubuntu cut % uniq uniq.txt
zhangsan 30
lisi 40
wangwu 50
zhaoliu 60
sunqi 70
zhouba 80
wujiu 90
#加上-c,去除重复项的同时,显示重复的次数
ydqun@VM-0-9-ubuntu cut % uniq uniq.txt -c
2 zhangsan 30
2 lisi 40
1 wangwu 50
3 zhaoliu 60
1 sunqi 70
2 zhouba 80
4 wujiu 90
#甚至利用管道|和sort一起配合使用,起排序重复项
ydqun@VM-0-9-ubuntu cut % uniq uniq.txt -c | sort
1 sunqi 70
1 wangwu 50
2 lisi 40
2 zhangsan 30
2 zhouba 80
3 zhaoliu 60
4 wujiu 90
#-d选项,仅列出有重复项的部分,wangwu和sunqi只有一项,不输出,-c计数
ydqun@VM-0-9-ubuntu cut % uniq uniq.txt -d -c
2 zhangsan 30
2 lisi 40
3 zhaoliu 60
2 zhouba 80
4 wujiu 90
#-u选项,仅列出没有重复项的部分,顺便-c验证是否没有重复
ydqun@VM-0-9-ubuntu cut % uniq uniq.txt -u -c
1 wangwu 50
1 sunqi 70
tee
简介
Linux tee命令用于读取标准输入的数据,并将其内容输出成文件。
语法
tee [-ai] file
常用参数说明
* -a 或 --append: 附加到既有文件的后面,而非覆盖它
* -b 或 --ignore-interrupts: 忽略中断信号
* --help
使用说明
tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。
特殊说明
1)#号后面是注释,不是命令,不要在Linux下运行
例子
ydqun@VM-0-9-ubuntu cut % cat test.txt | tee tee_file
Hello world!
Hello c!
Hello cpp!
Hello China!
ydqun@VM-0-9-ubuntu cut % cat tee_file
Hello world!
Hello c!
Hello cpp!
Hello China!
ydqun@VM-0-9-ubuntu cut % cat test.txt | tee tee_file -a
Hello world!
Hello c!
Hello cpp!
Hello China!
ydqun@VM-0-9-ubuntu cut % cat tee_file
Hello world!
Hello c!
Hello cpp!
Hello China!
Hello world!
Hello c!
Hello cpp!
Hello China!
split
简介
Linux split命令用于将一个文件分割成数个
语法
spilt [-bl]
常用参数说明
* -<行数>: 指定每多少行切成一个小文件
* -b <字节>: 指定每多少字节切成一个小文件
* -b: 忽略前面的空格符
使用说明
Linux split命令用于将一个文件分割成数个,该指令将大文件分割成较小的文件,在默认情况下将按照每1000行切割成一个小文件。
特殊说明
1)#号后面是注释,不是命令,不要在Linux下运行
例子
ydqun@VM-0-9-ubuntu split % cat name.txt
xiaoming
xiaohong
xiaozhi
xiaolan
xiaoqun
yuqun
yuhua
zhiming
yanzhi
yanhua
yuanhua
songhua
tansheng
tanbin
lihu
hujun
huli
hukai
luwei
luben
ydqun@VM-0-9-ubuntu split % split name.txt -l 10
ydqun@VM-0-9-ubuntu split % ls
name.txt xaa xab
ydqun@VM-0-9-ubuntu split % cat xaa
xiaoming
xiaohong
xiaozhi
xiaolan
xiaoqun
yuqun
yuhua
zhiming
yanzhi
yanhua
xargs
简介
Linux 参数代换
语法
xargs [-0pne]
常用参数说明
* 将特殊字符还原为普通字符
* -eEOF:当xargs读到EOF时停止
* -p: 执行指令前询问
* -n num: 每次执行command时需要的参数个数
例子
ydqun@VM-0-9-ubuntu xargs % cat 1.txt 2.txt
hello world!
Hello cpp!
#这里我们是想找出所有后缀为.txt的文件,并用cat去查看这些文件的内容,而不出打印出它们的名字,也就是|(管道)前的命令的输出不是做为
#|(管道)后的命令的标准输入,而是作为第二条命令的参数输入。
ydqun@VM-0-9-ubuntu xargs % find ./ -name "*.txt" | cat
./2.txt
./1.txt
#用xargs把|(管道)前的命令的标准输出作为管道后的命令的参数输入
ydqun@VM-0-9-ubuntu xargs % find ./ -name "*.txt" | xargs cat
Hello cpp!
hello world!
综合运用习题
1.tr命令对文件的重命名,内容的替换操作。
第一题
“1 2 3 4 5 6 7 9 a v 你好 . /8”
求以上字符串中所有数字之和
ydqun@VM-0-9-ubuntu xargs % echo "1 2 3 4 5 6 7 9 a v 你好 . /8 .txt" #原本的输出
1 2 3 4 5 6 7 9 a v 你好 . /8 .txt
ydqun@VM-0-9-ubuntu xargs % echo "1 2 3 4 5 6 7 9 a v 你好 . /8 .txt" | tr -c -s "0-9" "\n" #把所有非数字的字符转化为\n字符,并压缩重复的\n换行符
1
2
3
4
5
6
7
9
8
ydqun@VM-0-9-ubuntu xargs % for i in `echo "1 2 3 4 5 6 7 9 a v 你好 . /8 " | tr -c -s "0-9\n" "\n"`; do #使用shell的for循环加命令替换符``求和
sum=$[ $sum + i ]
done
ydqun@VM-0-9-ubuntu xargs % echo ${sum}
45
第二题
请将该文件中所有大写字母转换为小写
echo “ABCefg” >> test.log
ydqun@VM-0-9-ubuntu xargs % echo "ABCefg" >> test.log
ydqun@VM-0-9-ubuntu xargs %
ydqun@VM-0-9-ubuntu xargs % cat test.log | tr "A-Z" "a-z" > test.log
ydqun@VM-0-9-ubuntu xargs % cat test.log
abcefg
2.找到PATH
变量中的最后一个路径。
ydqun@VM-0-9-ubuntu xargs % echo ${PATH} | tr ":" "\n" | tail -1 #先用tr命令,把环境变量中的:转化为\n,在用tail取最后一行
/snap/bin
3.使用last
命令,输出所有的关机信息。
ydqun@VM-0-9-ubuntu xargs % last | grep boot #用last命令+grep查看即可
4.将/etc/passwd
中的内容按照用户名字典序排序。
ydqun@VM-0-9-ubuntu cut % cat /etc/passwd | sort
_apt:x:104:65534::/nonexistent:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
cjj:x:1002:1002:caijunjie,E6,none,none,none:/home/cjj:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
dnsmasq:x:107:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
games:x:5:60:games:/usr/games:/usr/sbin/nologin
glj:x:1001:1001:guolujuan,110,***********,******,None:/home/glj:/bin/bash
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
. . . . . .
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
5.将/etc/passwd
中的内容按uid
排序。
ydqun@VM-0-9-ubuntu cut % cat /etc/passwd | sort -t ":" -k 3 -n #先用-t指定:为分隔符,取分隔后的第三部分(就是uid),在加-n表示以纯数字形式排序
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
. . . . . .
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
6.在云主机上查找系统登录用户的总人次。
ydqun@VM-0-9-ubuntu cut % last | grep -v "wtmp" | grep -v "boot" | grep -v "^$" | wc -l #过滤掉wtmp,boot和空行(^$),在用wc去计算行数即可
204
7.将云主机中登录的所有用户名,按照次数排序,并输出次数。
ydqun@VM-0-9-ubuntu ~ % last | grep -v "^$" | grep -v "wtmp" | grep -v "boot"| cut -d " " -f 1 | sort | uniq -c #过滤掉wtmp,boot和空行(^$),然后用cut截取登录的用户,再用sort排序,最后用uniq去重并统计
4 cjj
203 ydqun
8.将本地的/etc
目录下的文件及目录,每十条保存到一个文件中。
ydqun@VM-0-9-ubuntu split % ls /etc/ | split -l 10 #用split指定ls /etc命令的标准输入的每10行作为一个新文件
ydqun@VM-0-9-ubuntu split % ls
xaa xab xac xad xae xaf xag xah xai xaj xak xal xam xan xao xap xaq xar xas xat
ydqun@VM-0-9-ubuntu split % cat xaa
acpi
adduser.conf
alternatives
apm
apparmor
apparmor.d
apport
apt
at.deny
bash.bashrc
9.将/etc/passwd
中存放的第10到20个用户,输出uid
,gid
和groups
。
ydqun@VM-0-9-ubuntu split % cat /etc/passwd | head -20 | tail -10 | cut -d ":" -f 1 | xargs -n 1 id #用cat配合head和tail就可以取出中间10行,并截取出这10行的用户名,并用xargs把每个用户名当做id的一个参数去查询
uid=10(uucp) gid=10(uucp) groups=10(uucp)
uid=13(proxy) gid=13(proxy) groups=13(proxy)
uid=33(www-data) gid=33(www-data) groups=33(www-data)
uid=34(backup) gid=34(backup) groups=34(backup)
uid=38(list) gid=38(list) groups=38(list)
uid=39(irc) gid=39(irc) groups=39(irc)
uid=41(gnats) gid=41(gnats) groups=41(gnats)
uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup)
uid=100(systemd-network) gid=102(systemd-network) groups=102(systemd-network)
uid=101(systemd-resolve) gid=103(systemd-resolve) groups=103(systemd-resolve)
10.将按照用户名查看/etc/passwd
中的用户,读到'sync'
用户是结束。
ydqun@VM-0-9-ubuntu split % cat /etc/passwd | cut -d ":" -f 1 | xargs -n 1 -esync id [0]
uid=0(root) gid=0(root) groups=0(root)
uid=1(daemon) gid=1(daemon) groups=1(daemon)
uid=2(bin) gid=2(bin) groups=2(bin)
uid=3(sys) gid=3(sys) groups=3(sys)
11.词频统计
使用下面这个命令生成一个文本文件。
cat >> a.txt << xxx
nihao hello hello 你好
nihao
hellols
cd
world
pwd
xxx
统计a.txt中各词的词频,并按照从大到小的顺序输出。
cat a.txt | tr -s " " "\n" | sort | uniq -c | sort -r