Linux 基础(5)
Linux 基础 (五)
一、shell相关知识
shell一般代表两个层面的意思,一个是命令解释器,比如BASH,另外一个就是shell脚本。通过解释器的角度来理解shel
命令分为:
==> alias(别名)
==> Compound Commands
==> function
==> build_in (内部命令)
==> hash
==> $PATH (外部命令)
==> error: command not found
获取一个命令会按照上述优先级取寻找,先找同名的alias命令,再找compound命令.........
别名:别名命令是为了简化输出给一个长参数命令的整合,别名的定义方法 alias la='ls -al' 取消别名 unalias la
内部命令:是BASH自带的命令 功能简单,内部命令的帮助在builtin(1)里
外部命令:是就是一个小程序存在于/bin/ /sbin/ /usr/bin 等地方
二、正则表达式
正则就是用来描述一类事物的规则
^ 行首
$ 行尾
. 除了换行符以外的任意单个字符
* 前导字符的零个或多个
.* 所有字符
[] 字符组内的任一字符
[^] 对字符组内的每个字符取反(不匹配字符组内的每个字符)
^[^] 非字符组内的字符开头的行
[a-z] 小写字母
[A-Z] 大写字母
[a-Z] 小写和大写字母
[0-9] 数字
+左边的有1个或者无穷多个
?左边的字符有0个或者1个
\< 单词头 单词一般以空格或特殊字符做分隔,连续的字符串被当做单词
\> 单词尾
三、文本编辑三剑客:grep 、sed 、awk
grep:
为了避免使用上的尴尬,以后就用egrep就OK
1)命令格式
egrep [cinvs] 'patten' filename
参数
-n :显示行号
-o :只显示匹配的内容
-q :静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容
-l :如果匹配成功,则只将文件名打印出来,失败则不打印,通常-rl一起用,grep -rl 'root' /etc
-A :如果匹配成功,则将匹配行及其后n行一起打印出来
-B :如果匹配成功,则将匹配行及其前n行一起打印出来
-C :如果匹配成功,则将匹配行及其前后n行一起打印出来
--color
-c :如果匹配成功,则将匹配到的行数打印出来
-E :等于egrep,扩展
-i :忽略大小写
-v :取反,不匹配
-w:匹配单词
grep相关练习
目标文件/etc/passwd,使用grep命令或egrep
1.显示出所有含有root的行:
cat /etc/passwd #显示passwd 的所有内容
egrep 'root' /etc/passwd #显示出所有含有root的行
2.输出任何包含bash的所有行,还要输出紧接着这行的上下各两行的内容:
egrep -C 2 "bash" /etc/passwd #输出任何包含bash的所有行,还要输出紧接着这行的上下各两行的内容
3. 显示出有多少行含有nologin
egrep -c "nologin" /etc/passwd #显示出有多少行含有nologin
4.显示出那些行含有root,并将行号一块输出。
egrep -n "nologin" /etc/passwd #显示出那些行含有root,并将行号一块输出 5.新建用户
abominable
abominate
anomie
atomize
编写正则表达式,将他们匹配出来
egrep 'a.omi(nabl|nat|z|)e' /etc/passwd
6.建四个用户
Alex213sb
Wpq2222b
yH438PIG
egon666
egon
过滤出用户名组成是字母+数字+字母的行 egrep '^[a-Z]+[0-9]+[a-Z]+' /etc/passwd
8.显示出/etc目录下所有包含root的文件名
egrep -rl 'root' /etc
9. 过滤掉/etc/ssh/sshd_config内所有注释和所有空行
grep -v '^#' /etc/ssh/sshd_config |grep -v '^ *$'
sed
流编辑器 stream editer,是以行为单位的处理程序
在使用过程中最好是记忆 sed -r xxxxx
sed [options] 'command' in_file[s]
options 部分
-n 使用安静(silent)模式
-e 直接在指令列模式上进行 sed 的动作编辑
-i 直接修改读取的档案内容,而不是由显示器输出
-f 直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作
command 部分
'[地址1,地址2] [函数] [参数(标记)]'
定址的方法 1.数字 2.正则
数字
十进制数
1 单行
1,3 范围 从第一行到第三行
2,+4 匹配行后若干行
4,~3 从第四行到下一个3的倍数行
2~3 第二行起每间隔三行的行
$ 尾行
1! 除了第一行以外的行
正则
正则必须用//包裹起来
删除某行 sed '$d' ab #删除最后一行
显示某行 sed -n '2,$p' ab #显示第二行到最后一行
增加一行或多行字符串 sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea"
代替一行或多行 sed '1,2c Hi' ab #第一行到第二行代替为Hi
替换一行中的某部分
格式:sed 's/要替换的字符串/新的字符串/g' (要替换的字符串可以用正则表达式)
sed -n '/ruby/p' ab | sed 's/ruby/bird/g' #替换ruby为bird
sed -n '/ruby/p' ab | sed 's/ruby//g' #删除ruby
sed 部分的练习题
ed作业:以/etc/passwd文件为模板 1,删除文件每行的第一个字符。 2,删除文件每行的第二个字符。 3,删除文件每行的最后一个字符。 4,删除文件每行的倒数第二个字符。 5,删除文件每行的第二个单词。 6,删除文件每行的倒数第二个单词。 7,删除文件每行的最后一个单词。 8,交换每行的第一个字符和第二个字符。 9,交换每行的第一个字符和第二个单词。 10,交换每行的第一个单词和最后一个单词。 11,删除一个文件中所有的数字。 12,删除每行开头的所有空格。 13,用制表符替换文件中出现的所有空格。 14,把所有大写字母用括号()括起来。 15,打印每行3次。 16,隔行删除。 17,把文件从第2行到第5行复制到第7行后面。(选做题) 18,把文件从第2行到第5行移动到第7行后面。(选做题) 19,只显示每行的第一个单词。 20,打印每行的第一个单词和第三个单词。 21,将格式为 mm/yy/dd 的日期格式换成 mm;yy;dd 22, a.txt内容
ABC
DEF
XYZ
通过SED实现tac命令
tac a.txt
XYZ
DEF
ABC
准备工作:先将/etc/passwd 下的20行作为测试的环境
head -20 /etc/passwd >test
cat test root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:998:997:User for polkitd:/:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
unbound:x:997:995:Unbound DNS resolver:/etc/unbound:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin cat test1
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 1.
sed -r 's/^(.)(.*)/\2/' test1 #删除文件每行的第一个字符 2.sed -r 's/^(.)(.)(.*)/\1\3/' test1 #删除文件每行的第二个字符 3.sed -r 's/(.*)(.)$/\1/' test1 #删除文件每行的最后一个字符 4.sed -r 's/(.*)(.)(.)$/\1\3/' test1 #删除文件每行的最后个第二字符 5.sed -r 's/^([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)/\1\2\4/' test1
# 删除文件每行的第二个单词
6. sed -r 's/([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)$/\1\3\4/' test1 #删除文件每行的倒数第二个单词 7.sed -r 's/([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)$/\1\2\3/' test1
#删除文件每行的最后一个单词 8.sed -r 's/^(.)(.)(.*)$/\2\1\3/' test1 #交换每行的第一个字符和第二个字符 9.sed -r 's/^(.)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)/\4\2\3\1\5/' test1 # 交换每行的第一个字符和第二个单词 10. sed -r 's/[0-9]//g' test1 # 删除一个文件中所有的数字 11.sed -r 's/^ *//g' test1 #删除每行开头的所有空格 12.sed -r 's/ /\t/g' test1 #用制表符替换文件中出现的所有空格 13. sed -r 's/[A-Z]/(&)/g' test1 #把所有大写字母用括号()括起来 14. sed 'p;p' test1 #打印每行3次 15. sed '1~2d' test1 #隔行删除 创建文件test2
vim test2
[root@localhost gandong]# cat test2
11111111111
2222222222
333333333
4444444444
55555555555
6666666666
777777777777
888888888888
99999999999999 16. sed '2h;3,5H;7G' test2 #把文件从第2行到第5行复制到第7行后面
17. sed '2h;3,5H;2,5d;7G' test2 #把文件从第2行到第5行移动到第7行后面 18.sed -r 's/^([a-Z]+)([^a-Z]+)(.*)/\1/' test1 #只显示每行的第一个单词
19.sed -r 's/^([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)$/\1\ \5/' test1 # 打印每行的第一个单词和第三个单词 20.
awk
awk是一个非常好用的数字处理工具。相比于sed常常作用于一整行的处理,awk则比较倾向于将一行分为数个“字段”来处理。运行效率高,而且代码简单,对格式化的文本处理能力超强。
awk的一般语法格式为:
awk [-参数 变量] 'BEGIN{初始化}条件类型1{动作1}条件类型2{动作2} 、、、、、END{后处理}'
或者为:awk [options] 'commands' files
NR变量定址
NR 表示AWK读入的行数
FNR表示读入行所在文件中的行数
逻辑运算 可直接引用域进行运算
== >= <= != > < ~ !~
# awk 'NR==1 {print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
1)参数说明:
-F re:允许awk更改其字段分隔符
-v var=$v 把v值赋值给var,如果有多个变量要赋值,那么就写多个-v,每个变量赋值对应一个-v
eg: 要打印文件a的第num行到num+num1行之间的行,
awk -v num=$num -v num1=$num1 'NR==num,NR==num+num1{print}' a
-f progfile:允许awk调用并执行progfile程序文件,当然progfile必须是一个符合awk语法的程序文件。
2)awk读取shell中的变量
可以使用-v选项实现功能
$b=1
$cat f
apple
$awk -v var=$b '{print var, $var}' f
1 apple
至于有没有办法把awk中的变量传给shell呢,这个问题我是这样理解的。shell调用awk实际上是fork一个子进程出来,而子进程是无法向父进程传递变量的,除非用重定向(包括管道)
a=$(awk '{print $b, '$b'}' f)
$echo $a
apple 1
注:此处内容参照:http://www.cnblogs.com/dong008259/archive/2011/12/06/2277287.html(如需了解请查阅)
3)输出重定向
awk的输出重定向类似于shell的重定向。重定向的目标文件名必须用双引号引用起来。
$awk '$4 >=70 {print $1,$2 > "destfile" }' filename
$awk '$4 >=70 {print $1,$2 >> "destfile" }' filename
练习题目:
1.打印uid在30~40范围内的用户名。
2.打印第5-10行的行号和用户名
3.打印奇数行
4.打印偶数行
5.打印字段数大于5的行
6.打印UID不等于GID的用户名
7.打印没有指定shell的用户
8.打印1..1000以内的7的倍数和包含7的数
先创建测试文档
head -20 /etc/passwd >test #把 /etc/passwd下的前五行内容输出到文件test 中
cat test #查看test1文件内容
cat test
cat test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:998:997:User for polkitd:/:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
unbound:x:997:995:Unbound DNS resolver:/etc/unbound:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
[root@localhost gandong]# cat test1
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 1.awk -F: '$3>29&&$3<41{print $1}' test #打印uid在30~40范围内的用户名
1.awk -F: '$3>=30&&$3<=40{print $1}' test
2.awk -F: 'NR>4&&NR<11{print $1,NR}' test #打印第五到第十行的行号及用户名
3.awk -F: 'NR%2{ print NR,$0}' test #打印奇数行
4.awk -F: '!(NR%2){print NR,$0}' test #打印偶数行
5.awk -F: 'NF>5{print NR,$0}' test #打印字段数大于5的行
6. awk -F: '$3!=$4{print NR,$1}' test #打印UID不等于GID的用户名
四、test命令
1.定义变量名的边界
eg:
[root@localhost gandong]# x=3
[root@localhost gandong]# echo ${x}%
3%
2.运算符(+ — * / %)
eg:
[root@localhost gandong]# echo $[3+1]
4
3.关系操作符号(>、 >=、 <、 <=、==、!=、&&、|| )
eg:
[root@localhost ~]# x=1
[root@localhost ~]# [ $x -gt 1 ]
[root@localhost ~]# echo $?
1
4.赋值运算(=、+=、*=、/=、%=)
eg:
[root@localhost ~]# x=10
[root@localhost ~]# [ x%3 ]
[root@localhost ~]# echo $x
10
[root@localhost ~]# ((x%3))
[root@localhost ~]# echo $x
10
[root@localhost ~]# ((x%=3))
[root@localhost ~]# echo $x
1
浮点运算:yum install bc -y(安装用于计算浮点类型的数据)
eg:
[root@localhost ~]# echo 'scale=2;1/3' |bc -l
.33 [root@localhost ~]# echo 'scale=2;1/3' |bc -l |cut -d. -f2
33
五、测试操作
命令执行后会返回到一个系统变量中 $?
如果$?值为0 表示命令执行成功 否则为失败
测试命令 test [ ] [[ ]] (( ))
打开man test 逐一介绍每个参数
-d :目录 test -d /boot
-s :文件长度 > 0、非空 test -s a.txt
-f :正规文件 test -f a.txt
-w :可写 test -w a.txt
-r :可读 test -r a.txt
-x :可执行 test -x a.txt
-L :符号连接
-u :文件有 suid 位设置
-z :空串
-n :非空串
-eq :等于 [ 50 -eq 50 ]
-ne :不等于 [ 50 -ne 60 ]
-gt :大于 (great than) [ 50 -gt 40 ]
-lt :小于 (less than ) [ 50 -lt 60 ]
-ge :大于等于 [ 50 -ge 50 ]
-le :小于等于 [ 50 -le 50 ]
比较数字,使用(( ))
其他测试使用 [[ ]]
包含数字比较的混合测试,使用[[ expr1 && expr2 ]] (( expr1 || expr2 ))
du -sh /boot/ #查看文件大小
find / -type f #查看普通文件
find / -name "*.txt" #查看根下以.txt结尾的文件
find / -size +30M #找出根下大于30M的文件
find / -size +10M -size +30M #找出根下大于10M且小于30M的文件
grep -rl 'root' /test #在/test下找出含root名的文件
混合测试练习:
[root@localhost ~]# [[ a = a&& 10 < 20 ]]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ a = a || 10 < 20 ]]
[root@localhost ~]# echo $?
0
Linux 基础(5)的更多相关文章
- Linux基础练习题(二)
Linux基础练习题(二) 1.复制/etc/skel目录为/home/tuer1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限. [root@www ~]# cp -r ...
- 大数据每日干货第四天(linux基础之一目录结构与常用命令)
为了和qq空间同步,也写的第四天,前面几天明天会发布,本来打算把每天学的东西记录下来,通过朋友给的建议要发的话稍微系统化下,从大数据需要的linux基础,到离线数据分析包括hadoop. ...
- Linux课程实践一:Linux基础实践(SSH)
一.SSH服务 1. 安装SSH (1)查看是否已经安装过ssh服务 rpm -qa |grep ssh (2)进行安装 sudo apt-get install openssh-server Ubu ...
- 还是不想改报告,伊阿忆啊哟-Linux基础继续
hi 虽然今天是最最美好的周六(前不着工作日后不着工作日),但老子还要来改报告,但额就是不想改,你拿我有啥办法啊... 争取完结Linux基础 一.Linux常用命令(三) 4.帮助命令 4.1 帮助 ...
- 原来今天是感恩节-Linux基础继续&MySQL和PHP
hi 原来今天是感恩节.虽然一直没有过这个节日的习惯,但仅仅是听到感恩的消息,都能想到一幅幅画面.愿大家安好! 下午开题会议还是有所收获,悄悄的,就变向那个不喜欢自己的人了. 一.Linux基础(二) ...
- 买错的电影票,含着泪也得看-LAMP搭建&Linux基础
hi 没说过,上周五室友过生请客,在龙湖里吃嗨了喝爽了,回去的路上侃侃而谈.说好的这周一起去看年内最后的大片,火星救援的,谁知道老子眼神不好,买错了电影的时间...把周六的约定提前到了今儿个下午,ma ...
- Linux基础3(文件权限)
文件权限 1.普通权限 (登陆用户对文件或目录的读写执行的权限) 普通权限对管理员用户无效 文件和目录 都有4中类型的用户u 所有者 : 文件.目录的创建者g 所属组 : 文件.目录属于的用户组o 其 ...
- Linux课程实践一:Linux基础实践(基础操作)
一.软件源维护 1. 基本操作 (1)查看源列表 sudo vim /etc/apt/sources.list deb:二进制软件安装包 deb-src:源码包 (2)备份软件源列表 sudo cp ...
- 实践一:Linux基础实践
一.Linux基础实践 1.1 1. 掌握软件源的维护方法,配置系统使用软件源镜像.掌握通过软件源来查找,安装,卸载,更新软件的方法. 这部分内容在许多学长学姐的报告里都有很详细的讲解,我在此就不赘述 ...
- Linux基础精华
Linux基础精华 (继续跟新中...) 常用命令: Linux shell 环境 让你提升命令行效 率的 Bash 快捷键 [完整版] 设置你自己的liux alias Linux的Find使用 L ...
随机推荐
- 1441: Min
1441: Min Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 320 Solved: 213[Submit][Status][Discuss] De ...
- calling c++ from golang with swig--windows dll(一)
calling c++ from golang with swig--windows dll 之前项目组开发的项目核心代码全部使用C++语言,新项目可能会引入golang,花了一天多时间研究了wind ...
- java初级开发一系列的工具安装配置
最近压力很大,刚刚帮朋友安装了一整套环境,按照印象写下此篇记录(没有图解),一是用来释放压力,二来希望可以帮到各位. 一.首先,Eclipse的安装,下载eclipse压缩包,一般为200~300M, ...
- PHP语言开发微信公众平台(订阅号)之开启开发者模式
(1)打开上一篇我们从花生壳官网获得的外网网址就会看到localhost根目录下的文件(这里不再赘述php环境的搭建).注:因为外网网址在能联网时,访问外网网址的任何人都能看到根目录下的所有文件,不仅 ...
- pageRank算法 python实现
一.什么是pagerank PageRank的Page可是认为是网页,表示网页排名,也可以认为是Larry Page(google 产品经理),因为他是这个算法的发明者之一,还是google CEO( ...
- Octave Tutorial(《Machine Learning》)之第四课《绘图数据》
第四课 Plotting Data 绘图数据 t = [0,0.01,0.98]; y1 = sin(2*pi*4*t); y2 = cos(2*pi*4*t); plot(t,y1);(绘制图1) ...
- 【Troubleshooting Case】Unable to delete Exchange database?
在我们日常邮件系统运维管理或实施部署变更中,经常会遇到,删除Exchange 数据库DB时,提示无法删除. ------------------– Microsoft Exchange Error - ...
- JavaWeb之多语言国际化
这周打算把国际化.JDBC和XML学习一下,从下周就开始学习三大框架,再坚持一个半月吧就能入门JavaWeb了,上周周末两天过的真是生不如死,两天坐在家里,醒来就写博客,原本在公司也自己操作了一遍,其 ...
- ZJOI2017 Day2
私のZJOI Day2 2017-3-22 08:00:07 AtCoder试题选讲 SYC(Sun Yican) from Shaoxing No.1 High School 2017-3-22 0 ...
- 提交任务到Spark
1.场景 在搭建好Hadoop+Spark环境后,现准备在此环境上提交简单的任务到Spark进行计算并输出结果.搭建过程:http://www.cnblogs.com/zengxiaoliang/p/ ...