1、找出example.html文件中<开头的行打印行号
grep -n "^<" example.html
1:<html>
10:</html>
awk '/^</{print FNR,$0}' example.html
1 <html>
10 </html>
grep [-acinv] [--color=auto] '搜寻字符串' filename
选项与参数:
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 '搜寻字符串' 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行
--color=auto :可以将找到的关键词部分加上颜色的显示
2、cut的使用,只擅长处理“以一个字符间隔”的文本内容,对于多空格不擅长
字节(bytes),用选项-b
字符(characters),用选项-c,作用与-b类似,但在中文字符起作用。
域(fields),用选项-f,与-d一起使用,默认为tab键
lsn@lsn:/$ cat /etc/passwd | head -n 3
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
lsn@lsn:/$ cat /etc/passwd | head -n 3 | cut -b 1-5
root:
daemo
bin:x
lsn@lsn:/$ cat /etc/passwd | head -n 3 | cut -c 1-5
root:
daemo
bin:x
lsn@lsn:/$ cat /etc/passwd | head -n 3 | cut -d : -f 6
/root
/usr/sbin
/bin
lsn@lsn:/$
3、file查看文件类型
file 1.txt
1.txt: ASCII text
4、sort 排序
lsn@lsn:~$ cat 1.txt
lsn tty1 2016-03-24 14:44
lsn pts/1 2016-03-24 14:44 (admin.lan)
lsn tty1 2016-03-24 14:44
lsn pts/1 2016-03-24 14:44 (admin.lan)
lsn@lsn:~$ sort 1.txt
lsn pts/1 2016-03-24 14:44 (admin.lan)
lsn pts/1 2016-03-24 14:44 (admin.lan)
lsn tty1 2016-03-24 14:44
lsn tty1 2016-03-24 14:44
sort命令是帮我们依据不同的数据类型进行排序,其语法及常用参数格式:
sort [-bcfMnrtk][源文件][-o 输出文件]
补充说明:sort可针对文本文件的内容,以行为单位来排序。
参 数:
-b 忽略每行前面开始出的空格字符。
-c 检查文件是否已经按照顺序排序。
-f 排序时,忽略大小写字母。
-M 将前面3个字母依照月份的缩写进行排序。
-n 依照数值的大小排序。
-o<输出文件> 将排序后的结果存入指定的文件。
-r 以相反的顺序来排序。
-t<分隔字符> 指定排序时所用的栏位分隔字符。
-k 选择以哪个区间进行排序。
ps aux |grep -v USER | sort -nk +4 | tail # 显示消耗内存最多的10个运行中的进程,以内存使用量排序。如果cpu就+3
5、uniq去重
lsn@lsn:~$ sort 1.txt | uniq
lsn pts/1 2016-03-24 14:44 (admin.lan)
lsn tty1 2016-03-24 14:44
6、read 提示用户输入,并将输入赋值给变量。
lsn@lsn:~$ read var:
7、expr 进行数学运算
expr 2 "*" 3 "+" 5
11
8、wc 计算行数、单词数、字符数
wc -lwc 1.txt
4 18 180 1.txt
9、echo 将文字打印到屏幕
echo "110"
110
10、tee 将数据输出到标准输出设备(屏幕) 和文件
lsn tty1 2016-03-24 14:44
lsn pts/1 2016-03-24 14:44 (admin.lan)
lsn@lsn:~$ cat 2.txt
lsn tty1 2016-03-24 14:44
lsn pts/1 2016-03-24 14:44 (admin.lan)
lsn@lsn:~$
11、basname返回文件名,dirname返回文件的当前路径
lsn@lsn:~$ basename 1.txt
1.txt
lsn@lsn:~$ dirname 1.txt
.
lsn@lsn:~$ pwd
/home/lsn
12、head和tail 打印开头和结尾
13、tr可以对来自标准输入的字符进行替换、压缩和删除
-c或——complerment:取代所有不属于第一字符集的字符;
-d或——delete:删除所有属于第一字符集的字符;
-s或--squeeze-repeats:把连续重复的字符以单独一个字符表示; -t或--truncate-set1:先删除第一字符集较第二字符集多出的字符。
例:替换
echo "HELLO WORLD" | tr 'A-Z' 'a-z'
hello world
cat text | tr '\t' ' ' 替换制表符为空格
例:删除
echo "hell456o worl789d"| tr -d '0-9'
hello world
例:将不在补集中的所有字符删除
lsn@lsn:~$ echo aa.,a 1 b#$bb 2 c*/cc 3 ddd 4 | tr -d -c '0-9 \n'
1 2 3 4
14、sed 是一个支持正则表达式的基本查找替换程序。
命令p用于显示模式空间的内容。默认情况下,sed把输入行打印在屏幕上,选项-n用于取消默认的打印操作。当选项-n和命令p同时出现时,sed可打印选定的内容。
在没有-n 的时候,包含模板的行将被打印两次, 但是在使用-n 的时候将只打印包含模板的行。
例:查找1.txt文件中包含admin的行
lsn@lsn:~$ cat 1.txt
lsn tty1 2016-03-24 14:44
lsn pts/1 2016-03-24 14:44 (admin.lan)
lsn tty1 2016-03-24 14:44
lsn pts/1 2016-03-24 14:44 (admin.lan)
lsn tty1 2016-03-24 14:44
lsn pts/1 2016-03-24 14:44 (admin.lan)
lsn pts/1 2016-03-24 14:44 (admin.lan)
lsn tty1 2016-03-24 14:44
lsn pts/1 2016-03-24 14:44 (admin.lan)
lsn pts/1 2016-03-24 14:44 (admin.lan)
lsn@lsn:~$ sed -n '/admin/p' 1.txt
lsn pts/1 2016-03-24 14:44 (admin.lan)
lsn pts/1 2016-03-24 14:44 (admin.lan)
lsn@lsn:~$
打印1到2行
lsn@lsn:~$ sed -n '1,2p' 1.txt
lsn tty1 2016-03-24 14:44
lsn pts/1 2016-03-24 14:44 (admin.lan)
逗号,可以选定行的范围
sed -n '/west/,/east/p' datafile
查找datafile文件中west到east之间的行
lsn@linux:~$ sed '/west/,/east/s/$/**VACA**/' datafile
northwest NW Charles Main 3.0 .98 3 34 **VACA**
western WE Sharon Gray 5.3 .97 5 23 **VACA**
southwest SW Lewis Dalsass 2.7 .8 2 18 **VACA**
southern SO Suan Chin 5.1 .95 4 15 **VACA**
southeast SE Patricia Hemenway 4.0 .7 4 17 **VACA**
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
命令d用于删除输入行。
例:删除最后一行,会显示其余行。删除保护admin的行
lsn@lsn:~$ sed '$d' 1.txt
lsn tty1 2016-03-24 14:44
lsn pts/1 2016-03-24 14:44 (admin.lan)
lsn tty1 2016-03-24 14:44
lsn@lsn:~$ sed '/admin/d' 1.txt
lsn tty1 2016-03-24 14:44
lsn tty1 2016-03-24 14:44
lsn@lsn:~$
命令s用于替换,g代表全局,可以使用-n和p指定匹配行。也可以将分隔符/替换成其他字符(换行符、反斜线除外)
行末尾的 g 标志表示命令作用的范围是整个行。也就是说,如果找到多个 admin,它们就都将被替换为 wocao。如果没有 g 标志,则只有每行第一个 admin被替换为 wocao
lsn@lsn:~$ sed 's/admin/wocao/g' 1.txt
lsn tty1 2016-03-24 14:44
lsn pts/1 2016-03-24 14:44 (wocao.lan)
lsn tty1 2016-03-24 14:44
lsn pts/1 2016-03-24 14:44 (wocao.lan)
lsn@lsn:~$ sed 's#admin#wocao#g' 1.txt
lsn tty1 2016-03-24 14:44
lsn pts/1 2016-03-24 14:44 (wocao.lan)
lsn tty1 2016-03-24 14:44
lsn pts/1 2016-03-24 14:44 (wocao.lan)
lsn@lsn:~$ sed -n '1,3s/admin/wocao/gp' 1.txt
lsn pts/1 2016-03-24 14:44 (wocao.lan)
lsn@lsn:~$
&符号表示替换字符串中被找到的部分。
sed 's/[0-9][0-9]$/&.5/' datafile
找到行尾数后两位为数字的在后面追加".5"
命令e是编辑命令,用于sed执行多个编辑任务的情况下。在下一行开始编辑前,所有的编辑动作将应用到模式缓冲区中的行上。执行顺序影响执行结果。
例:lsn@lsn:~$ sed -e '/tty/d' -e 's/admin/wocao/g' 1.txt
lsn pts/1 2016-03-24 14:44 (wocao.lan)
lsn pts/1 2016-03-24 14:44 (wocao.lan)
lsn@lsn:~$ sed -e '1,2d' -e 's/admin/wocao/g' 1.txt
lsn tty1 2016-03-24 14:44
lsn pts/1 2016-03-24 14:44 (wocao.lan)
a\ 命令是追加命令,追加将添加新文本到文件中当前行(即读入模式缓冲区中的行)的后面。所追加的文本行位于sed命令的下方另起一行。如果要追加的内容超过一行,则每一行都必须以反斜线结束,最后一行除外。最后一行将以引号和文件名结束。
lsn@lsn:~$ sed '/44$/a\11111111' 1.txtlsn tty1 2016-03-24 14:44
11111111
lsn pts/1 2016-03-24 14:44 (admin.lan)
lsn tty1 2016-03-24 14:44
11111111
lsn pts/1 2016-03-24 14:44 (admin.lan)
15、awk 把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
命令行模式
awk [-F field-separator] 'commands' input-file(s) 其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。
awk工作流程是这样的:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或 "[tab]键",也可以通过-F去指定。
例:默认分隔符为空格
lsn@lsn:~$ last -n 5 | awk '{print $1}'
lsn
reboot
lsn
lsn
lsn
例:通过-f制定为:
lsn@lsn:~$ head -n 5 /etc/passwd | awk -F ':' '{print $1}'
root
daemon
bin
sys
sync
例:显示1和7域,通过"\t"进行分割
lsn@lsn:~$ head -n 5 /etc/passwd | awk -F ':' '{print $1"\t"$7}'
root /bin/bash
daemon /bin/sh
bin /bin/sh
sys /bin/sh
sync /bin/sync
例:开始和结束流程,制作表格。先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。
lsn@lsn:~$ head -n 5 /etc/passwd | awk -F ':' 'BEGIN{print "name\tshell"}{print $1"\t"$7} END{print "begin\tend"}'
name shell
root /bin/bash
daemon /bin/sh
bin /bin/sh
sys /bin/sh
sync /bin/sync
begin end
例:类似grep用法,匹配查找字符用//括起来。
lsn@lsn:~$ awk -F: '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
lsn@lsn:~$ awk -F: '/root/{print $1"\t"$7}' /etc/passwd
root /bin/bash
awk内置变量
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
例:
lsn@lsn:~$ awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/bin/sh
filename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/sh
filename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/sh
例:使用printf更加简洁
awk -F ':' '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd