NIUHE

日々私たちが过ごしている日常というのは、実は奇迹の连続なのかもしれんな

Linux常用命令总结(二):数据处理

Linux常用命令总结

数据流重定向

  • 标准输入(stdin) : 代码为0,使用<<<
  • 标准输出(stdout) : 代码为1,使用>>>
  • 标准错误输出(stderr) : 代码为2,使用2>2>>

范例:

1
$ ls /home > ~/homefile # 将屏幕信息输出到homefile里

/dev/null垃圾黑洞设备

/dev/null可以吃掉任何导向这个设备的信息

范例:

1
2
$ find /home -name .bashrc 2> /dev/null
# 只有stdout会显示到屏幕上,stderr被丢弃了

将正确与错误数据写入同一文件

1
2
$ find /home -name .bashrc > list 2>&1
$ find /home -name .bashrc &> list

<<<

stdin替代键盘输入以创建新文件的简单流程

1
$ cat > catdile < ~/.bashrc

<<代表输入结束:

1
2
3
$ cat > catfile << "eof"
> This is a test.
> eof # 输入这个关键字,立刻结束而不需要[ctrl]+d

tee -双向重定向

1
2
$ tee [-a] file
参数:-a : 以累加的方式输出到文件

tee可以让standard output转存一份到文件内并将同样的数据继续送到屏幕上。

选取命令 : cut、grepsad

cut -在一行信息中取出想要的

用法: cut -d '分割字符' -f fields cut -c 字符范围 参数: * -d : 后面接分割字符,与 -f 一起使用 * -f : 依据-d的分割字符将一段信息切割成数段,用-f取出第几段的意思 * -c : 以字符的单位取出固定字符区间 例: echo $PATH | cut -d ':' -f 4 export | cut -c 12-

sed 工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ sed [-nefr] [动作]
参数:
-n : 使用安静模式。只有经过sed特殊处理的那一行才会被列出来
-e : 直接在命令行模式上进行sed动作编辑
-f : -f filename 可以执行filename里的sed动作
-r : sed的动作支持的是扩展型正则表达式的语法
-i : 直接修改读取的文件内容,而不是屏幕输出

动作说明: [n1[, n2]]funciton
n1, n2 : 不见得会存在,一般代表选择进行动作的行数

function有以下:
a : 新增, a的后面可以接字符串,这些字符串会出现在目前行的下一行
c : 替换, c的后面可以接字符串,这些字符串可以替换n1-n2之间的行
d : 删除
i : 插入, i的后面可以接字符串,这些字符串会出现在目前行的上一行
p : 打印, 将某个选择的数据打印出来,通常与-n连用
s : 替换, 可以直接进行替换工作,可以搭配正则表达式

以行为单位的新增/删除功能

1
2
3
4
5
# 将/etc/passwd 的内容列出并且打印行号,同时将第2-5行删除
$ nl /etc/passwd | sed '2,5d'

# 在第二行后加上"drink tea?"字样
$ nl /etc/passwd | sed '2a drink tea'

用s命令替换

1
2
3
4
5
6
7
8
9
$ cat pets.txt
This is my cat
my cat's name is betty
This is my dog
my dog's name is frank
This is my fish
my fish's name is george
This is my goat
my goat's name is adam

把其中的 my 字符串替换成 Hao Chen’s,下面的语句应该很好理解(s表示替换命令,/my/表示匹配my,/Hao Chen’s/表示把匹配替换成Hao Chen’s,/g 表示一行上的替换所有的匹配):

1
2
3
4
5
6
7
8
9
$ sed "s/my/Hao Chen's/g" pets.txt
This is Hao Chen's cat
Hao Chen's cat's name is betty
This is Hao Chen's dog
Hao Chen's dog's name is frank
This is Hao Chen's fish
Hao Chen's fish's name is george
This is Hao Chen's goat
Hao Chen's goat's name is adam

注意:如果你要使用单引号,那么你没办法通过’这样来转义,就有双引号就可以了,在双引号内可以用”来转义。

grep -分析一行信息,若有想要的就拿出整行

用法: grep [-acinv] [-A] [-B] [--color=auto] '查找字符串' filename 参数: * -a : 将binary文件以text文件的方式查找数据 * -c : 计算找到'查找字符串'的次数 * -i : 忽略大小写 * -n : 输出行号 * -v : 反向选择 * -A : 后面接数字,为after的意思,后续的n行也列出来 * -B : 后面接数字,为before的意思,前面的n行也列出来 * --color=auto : 可以将找到的关键字部分加上颜色显示

例:

1
2
3
$ last | grep -v 'neymar' | cut -d ' ' -f 1
$ dmesg | grep -n -A3 -B2 --color=auto 'eth'
# dmesg可列出内核产生的信息。通过grep来选取网卡相关信息

排序命令:sort, wc, uniq

sort

用法: sort [-fbMnrtuk] [file or stdin] 参数: * -f : 忽略大小写 * -b : 忽略最前面空格 * -M: 以月份的名字来排序 * -n : 使用纯数字进行排序(默认以文字类型来排序) * -r : 反向排序 * -u : 就是uniq,相同的数据中,仅出现一行代表 * -t : 分隔符,默认用[Tab]来分割,配合-k使用 * -k : 后面加数字,以-t分割出来的哪个区间进行排序 例: last | cut -d '.' f 1 | sort

uniq -重复数据仅列出一个

用法: uniq [-ic] 参数: * -i : 忽略大小写字符的不同 * -c : 进行计数 例: last | cut -d ' ' -f1 | sort | uniq -c

wc - 计算输出信息的整体数据

用法: wc [-lwm] 参数: * -l : 仅列出行 * -w: 仅列出多少字 * -m : 仅列出多少字符 例: cat /etc/passwd | wc

awk - 数据处理工具

awk主要是处理每一行的字段内数据,而默认的字段的分隔符为空格键或[tab]键

用法: awk '条件类型1{动作1} 条件类型2{动作2} … ' filename

awk的内置变量与含义: * $0 一整行数据 * $1, $2 … $n 第1列,第2列 …. 第n列 * NF 每一行拥有的字段总数 * NR 目前处理的行数 * FS 目前的分隔符,默认时空格键

awk的逻辑运算符: * > < >= <= == !=

说明: * 所有awk动作,即在{}内的动作,如果有需要多个命令辅助时,可用”;“间隔,或者直接以[Enter]键来隔开每个命令 * 与bash、shell的变量不同,在awk中,变量可以直接使用,不需要加”$“

举例: * 取出账号与登录者IP,且账号与IP之间以[tab]隔开: last -n 5 | awk '{print $1 “\t” $3}' * 列出每一行的账号,列出正在处理的行数,并说明该行有多少字段: last -n 5 | awk '{print $1 “\t lines: “ NR “\t columes: “ NF}' * 在/etc/passwd中以”:“来分隔字段,列出第三列小于10的数据,并且仅列出账号与第三列 cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t" $3}'

Powered by Hexo and Theme by Hacker
© 2019 NIUHE