目录
最近需要做数据分析处理,比较反复,因此在linux下使用shell命令会更加方便高效,有助于工作开展,特作此总结。
参考:https://www.runoob.com/linux/
参考:https://blog.51cto.com/191226139/2060467
参考:https://www.runoob.com/linux/linux-comm-awk.html
awk [-F field-separator] ‘commands‘ input-file(s)
,其中commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。|head
表示将输出的结果执行head
命令,即查看前10个;awk -F‘|‘ ‘{print $2}‘ 20191111.txt |sort|uniq -c,表示将awk分析出来的数据线进行排序,然后进行唯一性统计。0000842FD3AD2B24DABD5CDB54B4C98A|1|1|2|20008.0||30|30|0|0|206|(_少惹(ωǒ
00008EE9519B8B2289D118C327121FD0|1|1|2|20015.0||18|19|0|0|399|Devin
0000A149C6BA44236E0C7A47152740DE|1|1|2|20017.0||1|1|0|0|411|向冒狙砍
00010625FEB0D71E2FB88F3C1AFD10A0|1|1|2|20013.0||26|28|0|0|1087|JK论
0001659D2D84227A85483D403445E292|1|1|2|20002.0||22|24|0|0|410|多多哟
awk ‘{[pattern] action}‘ {filenames}
行匹配语句awk ‘ ‘ 只能用单引号awk -F ‘|‘ ‘{print $1,$5}‘ 20191207.txt | head
$ awk -F '|' '{print $1,$5}' 20191207.txt | head
0000842FD3AD2B24DABD5CDB54B4C98A 20008.0
00008EE9519B8B2289D118C327121FD0 20015.0
0000A149C6BA44236E0C7A47152740DE 20017.0
00010625FEB0D71E2FB88F3C1AFD10A0 20013.0
0001659D2D84227A85483D403445E292 20002.0
000295610E8C9A2B32706693D49BBEB8 20004.0
举例2:格式化输出:awk -F ‘|‘ ‘{printf "%-40s %-5s\n",$1,$4}‘ 20191202.txt |head
$ awk -F '|' '{printf "%-40s %-5s\n",$1,$4}' 20191202.txt |head
05029748828D6159755581E69C1C8BCA 2
05D2A89B39B38BACF634B2138B612091 2
09870F01A8D18BA9F2F7042042EDE5B8 2
09FAD5B9664DAAE1DD5C6AB2AADE2AAC 2
0CB9496935127969124389655392778A 2
举例3:使用内建变量:awk ‘BEGIN{FS="|"}‘ ‘{print $1,$4}‘ 20191202.txt |head
出现问题???
举例4:使用多个分隔符,先使用空格分隔,然后对分隔结果再使用“,”分隔
$ awk -F '[ ,|]' '{printf "%-40s %-5s\n",$1,$4}' 20191202.txt | head -n 5
05029748828D6159755581E69C1C8BCA 2
05D2A89B39B38BACF634B2138B612091 2
09870F01A8D18BA9F2F7042042EDE5B8 2
09FAD5B9664DAAE1DD5C6AB2AADE2AAC 2
0CB9496935127969124389655392778A 2
awk -v #设置变量
$ awk -F '|' -v a=10 '{print $4,$4+a}' 20191202.txt | head -n 5
2 12
2 12
2 12
2 12
2 12
awk -f {awk脚本} {文件名}
——一般用不上这个脚本$ awk -f cal.awk 20191202.txt
(1)过滤第2列大于等于2的行:$2>=2
(不太清楚为什么|没有被区分开)
$ awk -F '[|]' '$2>=2' 20191202.txt |head -n 5
05029748828D6159755581E69C1C8BCA|4|1|2|80001.0||1|32|0|0|17392|6) 虎牙丶冰焰 虎牙丶冰焰2 虎牙丶冰焰3
0CB9496935127969124389655392778A|3|1|2|80001.0||16|60|0|0|5843|。。。 暂停厌倦 美丽的蔷薇
1269B2D7562A5F04B76C4A3AFB9DFE39|2|1|2|80001.0||23|46|0|0|992|空城 虎牙新游梁少
12CE8AC0AE43CA71767A0F4C274BAB01|2|1|2|80001.0||40|46|0|0|2154|日月 日月.
199183A61470216FDD835F509B885DB6|3|1|2|80001.0||1|44|0|0|2132|安琪拉 纯珍珠(??? 迎风破浪一刀斩
(2)过滤第2列等于2的行
$ awk -F '|' '$2==2 {print $1, $2, $5}' 20191202.txt |head -n 5
1269B2D7562A5F04B76C4A3AFB9DFE39 2 80001.0
12CE8AC0AE43CA71767A0F4C274BAB01 2 80001.0
1FB758259951CA17940327806CB5A4BC 2 80001.0
20DC1E4B6E326D9DEA86F47E77E32B68 2 80001.0
21C4B33E879FCC5EADED49D634F58A83 2 80001.0
(3)过滤第2列大于等于2并且第5列等于‘70001’的行
$ awk -F '|' '$2>=2 && $5="70001"' 20191202.txt |head -n 5
05029748828D6159755581E69C1C8BCA 4 1 2 70001 1 32 0 0 17392 6) 虎牙丶冰焰 虎牙丶冰焰2 虎牙丶冰焰3
0CB9496935127969124389655392778A 3 1 2 70001 16 60 0 0 5843 。。。 暂停厌倦 美丽的蔷薇
1269B2D7562A5F04B76C4A3AFB9DFE39 2 1 2 70001 23 46 0 0 992 空城 虎牙新游梁少
12CE8AC0AE43CA71767A0F4C274BAB01 2 1 2 70001 40 46 0 0 2154 日月 日月.
199183A61470216FDD835F509B885DB6 3 1 2 70001 1 44 0 0 2132 安琪拉 纯珍珠(??? 迎风破浪一刀斩
(4)格式化输出结果">"
$ awk -F '|' '$2>=2 && $5="70001" {print $1,">", $2,">",$5}' 20191202.txt |head -n 5
05029748828D6159755581E69C1C8BCA > 4 > 70001
0CB9496935127969124389655392778A > 3 > 70001
1269B2D7562A5F04B76C4A3AFB9DFE39 > 2 > 70001
12CE8AC0AE43CA71767A0F4C274BAB01 > 2 > 70001
199183A61470216FDD835F509B885DB6 > 3 > 70001
(1)FILENAME,将文件名和第1列、第5列一起输出
# 个性化输出内建变量和文本数据内容(前置字符串长度输出)
$ awk -F '|' 'BEGIN{printf "%s %40s %10s\n","FILENAME","uin","worldid"}{printf "%s %40s %10s\n", FILENAME, $1, $5}' 20191202.txt | head -n 5
FILENAME uin worldid
20191202.txt 05029748828D6159755581E69C1C8BCA 80001.0
20191202.txt 05D2A89B39B38BACF634B2138B612091 20001.0
20191202.txt 09870F01A8D18BA9F2F7042042EDE5B8 80001.0
20191202.txt 09FAD5B9664DAAE1DD5C6AB2AADE2AAC 80001.0
# 个性化输出(后置字符串长度输出)
$ awk -F '|' 'BEGIN{printf "%-15s %-40s %-10s\n","FILENAME","uin","worldid"}{printf "%-15s %-40s %-10s\n", FILENAME, $1, $5}' 20191202.txt | head -n 5
FILENAME uin worldid
20191202.txt 05029748828D6159755581E69C1C8BCA 80001.0
20191202.txt 05D2A89B39B38BACF634B2138B612091 20001.0
20191202.txt 09870F01A8D18BA9F2F7042042EDE5B8 80001.0
20191202.txt 09FAD5B9664DAAE1DD5C6AB2AADE2AAC 80001.0
(2)ARGIND,命令行中当前文件的位置
awk ‘ARGIND==1{bk[$1]=1}ARGIND>=2{if(bk[$1]==1)print $1}‘ tt.txt /cephfs/gdata/2602/result/uin_monitor/201909*|sort -u|wc -l
print $1
。awk ‘{if(ARGIND==1){print "处理a文件"} if(ARGIND==2){print "处理b文件"}}‘ a b
(1)使用正则,字符串匹配
~
表示模式开始,/str/
中的str表示模式。
# 输出满足第12列包含"。"字符串的行的第1、2、12列
$ awk -F '|' '$12 ~ /。/ {print $1, $2, $12}' 20191202.txt | head -n 5
0CB9496935127969124389655392778A 3 。。。 暂停厌倦 美丽的蔷薇
493EA9A54F9416019659F571AB573D5D 4 你的名字? 彼岸花。 彼岸花! 有心人
A0E0EFA7522A693A10EFE66AD75C96EA 1 七缘。
C0F221D5FF0B18E64724E47B0E1E5AE3 1 黑白。
F2E9BFD4C35C27AE651F40ADACFE57BD 1 乔碧萝。
# 输出满足第1列包含"BCA"字符串的行的第1、2、12列
$ awk -F '|' '$1 ~ /BC/ {print $1, $2, $5, $12}' 20191202.txt | head -n 5
05029748828D6159755581E69C1C8BCA 4 80001.0 6) 虎牙丶冰焰 虎牙丶冰焰2 虎牙丶冰焰3
1011902B19BC28EC9755C74E3BCD4C94 1 20001.0 雄壮的北冕
1FB758259951CA17940327806CB5A4BC 2 80001.0 哈喽:小娘子 给爸爸跪下
22707AD961D5BC33CCE6FD0588E06322 2 80002.0 虎牙念安 虎牙熙熙呦
243A53550023BC41B838065FD4AEB6D8 3 80001.0 飘T落 飘o落 飘落
(2)忽略大小写:BEGIN{IGNORECASE=1}匹配
$ awk -F '|' '$1 ~ /bc/ {print $1, $2, $5, $12}' 20191202.txt | head -n 5
o0z0oxD3k7IiSDacbcwqJ3k33RyQ 1 70001.0 ??柔?情??
o0z0oxJk9RcIb7rt8w1jbctLG1J8 1 70002.0 沐沐
awk -F '|' 'BEGIN{IGNORECASE=1} $1 ~ /bc/ {print $1, $2, $5, $12}' 20191202.txt | grep o0z0oxD3k7IiSDacbcwqJ3k33RyQ
o0z0oxD3k7IiSDacbcwqJ3k33RyQ 1 70001.0 ??柔?情??
(3)模式取反:在模式开始的前面加个!,表示模式取反,即不匹配模式的数据
awk -F '|' 'BEGIN{IGNORECASE=1} $1 !~ /bc/ {print $1, $2, $5, $12}' 20191202.txt | head -n 5
05D2A89B39B38BACF634B2138B612091 1 20001.0 雄壮的卡努
09870F01A8D18BA9F2F7042042EDE5B8 1 80001.0 玉兔
09FAD5B9664DAAE1DD5C6AB2AADE2AAC 1 80001.0 霸道小姐姐丫
0CB9496935127969124389655392778A 3 80001.0 。。。 暂停厌倦 美丽的蔷薇
0CD1F8F5BBB0EB846D3450FE2E1707E9 1 80001.0 风萧萧兮易水寒
(4)awk脚本
$ cat score.txt
Marry 2143 78 84 77
Jack 2321 66 78 45
Tom 2122 48 77 71
Mike 2537 87 97 95
Bob 2415 40 57 62
#!/bin/awk -f
#运行前(初始化变量)
BEGIN{
math = 0
english = 0
computer = 0
printf "NAME NO. MATH ENGLISH COMPUTER TOTAL\n"
printf "------------------------------------\n"
}
#运行中(循环运行每一条记录)
{
math+=$3
english+=$4
computer+=$5
printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3, $4, $5, $3+$4+$5
}
#运行后(输出运算后的变量结果)
END{
printf "-------------------------------------\n"
printf " TOTAL:%10d %8d %8d \n", math, english, computer
printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}
$ awk -f cal.awk score.txt
NAME NO. MATH ENGLISH COMPUTER TOTAL
------------------------------------
Marry 2143 78 84 77 239
Jack 2321 66 78 45 189
Tom 2122 48 77 71 196
Mike 2537 87 97 95 279
Bob 2415 40 57 62 159
-------------------------------------
TOTAL: 319 393 350
AVERAGE: 63.80 78.60 70.00
参考:https://blog.51cto.com/191226139/2060467
grep 、sed、awk被称为linux中的"三剑客"。
这三个"剑客"各有特长。
grep 适合单纯的查找或匹配文本
sed 适合编辑匹配到的文本
awk 适合格式化文本,对文本进行较复杂格式处理。报告生成器,格式化文本输出。
image
$1, $2, ... $n
,成为域标识。$0为所有域,也就是整条记录。而shell的$0
表示文件名本身。{print}
,即打印所有参考:linux命令大全
参考2:https://www.runoob.com/linux/linux-comm-cat.html
cat [-Abn] [--help] [--version]
-n
表示由1开始对所有输出的行数编号;-b
只是对与空白行不编号;-a
表示显示所有;cat -n textfile1 > textfile2
表示把textfile1的文档内容加上行号后输入textfile2这个文档里;cat /dev/null > /etc/test.txt
表示清空该文档中的内容;cat img_file > /dev/fd0
表示把ima_file写入到软盘中;参考:https://blog.csdn.net/carolzhang8406/article/details/6112707
head命令用来查看具体文件的前面几行的内容,具体格式如下:head <filename>
我们可以通过head命令查看具体文件最初的几行内容,默认为前十行;如果想看前20行,则可以:
head -n 20 test.txt
参考:https://www.runoob.com/linux/linux-comm-tail.html
tail命令可用于查看文件的尾部内容,又一个常用的参数-f
常用于查阅正在改变的日志文件。
tail -f filename
会把filename文件里的最尾部的内容显示在屏幕上,并且不断刷新,只要filename更新就可以看到最新的文件内容。
tail -n 20 filename
显示尾部20行,tail -c 10 filename
显示最后10个字符;
参考:https://www.runoob.com/linux/linux-comm-sort.html
sort [-cdfmnr] 文件
-c
表示检查文件是否已经按照顺序排序。-d
表示排序时,处理英文字母、数字及空格字符外,忽略其他的字符。-m
表示将几个排序好的文件进行合并。-n
表示依照数值的大小排序,-r
表示以相反的顺序来排序。sort testfile
表示在使用sort命令以默认的式对文件的行进行排序;参考:https://www.runoob.com/linux/linux-comm-uniq.html
uniq [-cw] [输入文件] [输出文件]
-c
表示在每列旁边显示该行重复出现的次数;-w
表示指定要比较的字符。-d
和--repeated
表示仅显示重复出现的行列,-u
和--unique
表示仅显示出现一次的行列,不加参数时默认为显示所有。uniq testfile.txt
可以将txt文件中相同的行删除;uniq -c testfile
表示检查文件并删除文件中重复出现的行,并在行首显示该行重复出现的次数;sort testfile1 | uniq
;参考:https://www.runoob.com/linux/linux-comm-wc.html
wc [-clw] 文件
,-c表示只显示Bytes数,-l表示只显示行数,-w表示只显示字数;$ wc testfile # testfile文件的统计信息
3 92 598 testfile # testfile文件的行数为3、单词数92、字节数598
参考:https://www.runoob.com/linux/linux-comm-grep.html
grep [字符串] [文件]
grep test *file
表示在在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。grep test test*
表示查找前缀有“test”的文件包含“test”字符串的文件grep -r update /etc/acpi
表示以递归的方式查找符合条件的文件参考:https://www.runoob.com/linux/linux-comm-join.html
join [文件1] [文件2]
-v
跟-a
相同,但是只显示文件中没有相同栏位的行;-a
除了显示原来的输出内容之外,还显示指令文件中没有相同栏位的行。join testfile_1 testfile_2
表示将两个文件中指定字段的内容相同的行连接起来;Hello 95
Linux 85
test 30
文件testfile_2的内容为:
Hello 2005
Linux 2009
test 2006
join testfile_1 testfile_2
之后输出的为
Hello 95 2005
Linux 85 2009
test 30 2006
(2)join -v 1 123.txt 124.txt
参考:https://www.cnblogs.com/mfryf/p/3402200.html
123.txt文件为
aa 1 2
bb 2 3
cc 4 6
dd 3 3
124.txt文件为:
aa 2 1
bb 8 2
ff 2 4
cc 4 4
dd 5 5
join -v 1 123.txt 124.txt的结果为:
cc 4 6
dd 3 3
join -a 1 123.txt 124.txt
aa 1 2 2 1
bb 2 3 8 2
cc 4 6
dd 3 3
参考:https://www.runoob.com/linux/linux-comm-sed.html
sed [-e] [script文件] [文本文件]
sed -e 4a\newLine testfile
表示在testfile文件的第四行后添加一行,并将结果输出到标准输出。参考:https://www.runoob.com/linux/linux-comm-set.html
set [-v]
,表示执行指令后,会先显示该指令及所下的参数。参考:https://www.runoob.com/linux/linux-comm-find.html
find path -option 字符串
参考:https://www.cnblogs.com/molong1208/p/5358509.html
(1)交集
sort a.txt b.txt | uniq -d
(2)并集
sort a.txt b.txt | uniq
(3)差集
a.txt - b.txt
sort a.txt b.txt | uniq -u
b.txt - a.txt
sort b.txt a.txt a.txt | uniq -u
$#, $@, $0, $1, $2
的含义解释参考:https://www.cnblogs.com/fhefh/archive/2011/04/15/2017613.html
$$
:shell本身的PID;$!
:shell最后运行后台Process的PID;$?
:最后运行的命令的结束代码;$-
:使用Set命令设定的Flag一览 ;$*
:所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。$@
:所有参数列表。如"$@"用「"」括起来的情况、以"$1" "\(2" … "\)n" 的形式输出所有参数。$#
:添加到Shell的参数个数 ;$0
:shell本身的文件名$1~$n
:添加到shell的各参数值。$1是第一参数、$2是第2参数。原文:https://www.cnblogs.com/hugechuanqi/p/12007262.html