1.vi全屏编辑器的使用
cp /etc/profile /a/profile // 从etc下复制profile文件到文件/a下
vi profile // 常规打开profile,进入全屏模式
vi profile +3 // 打开profile,光标定位到第三行
vi profile +33 按住insert,输入:,此时进入末行模式,系统会接收输入的命令,
此时输入set nu,表示行号展示,再次看,会看到光标前面有33
------------------------------------------------------------
tips:几个小的编辑时候的技巧
vi profile // 进入编辑器,此时定位是第一行
shift + o // 表示在原始的编辑模式下,在第一行前面插入行,进入插入模式inset
o // 表示在原始的编辑模式下,在第一行的后面插入行,进入插入模式
i // 表示进入插入模式,此时的插入是从光标前面开始插入
a // 表示进入插入模式,此时的插入是从光标后面插入
shift + a // 表示A,此时定位到整行的尾端
shift + i // 表示I,此时定位到整行的首端
-----------------------------------------------------------------
vi profile // 初始进入编辑模式,按insert进入插入模式
esc // 表示退出插入模式,此时可以进行下面的操作
注意命令行模式需要从编辑模式进入,插入模式是不能直接进入命令行模式的!!!!
:q // 文件没更改,推出
:wq // 文件被更改,保存推出,对于修改的文件不后悔
:q! // 不保存退出,也就是对于修改的文件后悔了
:w // 保存
:w! // 强制保存
:wq == :x // 两者等同
vi编辑模式的相关快捷键
快捷键 | 含义 |
---|---|
h | 光标前移 |
j | 光标下移 |
k | 光标上移 |
l | 光标后移 |
w | 移至下一个单词词首 |
e | 移动当当前单词末尾或者下一个单词末尾 |
b | 移动到当前单词头部或者上一个单词头部 |
0 | 绝对行首 |
^ | 行首的第一个非空字符 |
$ | 绝对行尾 |
G | 直接定位文章末行 |
3G | 直接定位第三行 |
gg | 直接定位第一行 |
ctrl+f | 向下翻页 |
ctrl+b | 向上翻页 |
快捷键 | 含义 |
---|---|
dd | 删除一行 |
dw | 删除一个单词 |
x | 删除光标位置字符 |
3x | 删除从光标开始的后面3个字符 |
r | 替换光标位置的字符 |
p | 粘贴 |
yw | 复制一个单词 |
yy | 复制一行 |
u | 撤销操作 |
ctrl+r | 恢复撤销的操作 |
. | 重复上一次的动作 |
/ esac | 查找esac |
n | 接上面查找时候向下查找,否则只能看到第一个 |
N | 接上面查找时候向上查找,否则只能看到第一个 |
!ls /a | 表示在此显示/a目录下的内容 |
快捷键 | 含义 |
---|---|
s/str1/str2 | 替换字符串,原始的字符串str1,替换的字符串str2 |
/ | 为临近字符串的边界字符,可以使用/、@、#替换 |
g | 表示一行内全部替换 |
i | 表示忽略大小写 |
查找替换范围 | ------------------------- |
n | 表示当前行号 |
. | 表示当前光标行 |
+n | 表示偏移n行 |
$ | 表示末尾行,$-3倒数三行 |
% | 表示全文 |
示例替换的用法:
// 表示范围为当前光标到最后一行,after替换为before,全行忽视大小写
.,$s/after/before/gi
.,$d // 删除当前光标到最后一行的内容
%d // 删除所有的内容
2.正则表达式学习
正则表达式的使用:
正则表达 | 含义 |
---|---|
/ | 转义字符 |
. | 匹配任意字符 |
[^0-9] | 非数字,其中的^表示非 |
^ | 表示正则以什么开头 |
$ | 表示正则以什么结尾 |
\<aabb\> | 表示匹配aabb单词,首尾需要转义 |
| | 连接符 |
(,) | 选择操作符 |
? | 匹配0次或者一次 |
* | 匹配0到多次 |
+ | 匹配1到多次 |
{n} | 匹配n次 |
{n,} | 匹配n到多次 |
{n,m} | 匹配n到m次 |
.* | 匹配任意字符 |
/n | 反向引用,n表示第几个括起来的表达式 |
3.cut&wc&sort&sed&awk学习
文本分析键 | 含义 |
---|---|
cut | 显示切割的行数据 |
-f | 选择显示的列 |
-d | 自定义分隔符 |
-s | 不显示没有分隔符的行 |
示例:
cut -d' ' -s -f1-3 grep.txt
// 表示自定义分隔符为' ',不展示没有分隔符的行,显示满足条件的1-3列,文件为grep.txt
文本分析键 | 含义 |
---|---|
sort | 排序文件的行,直接排序默认按照字典序 |
-n | 按数值排序 |
-r | 倒序排列 |
-t | 自定义分隔符 |
-k | 选择排序列,一般和分隔符配合使用 |
-u | 合并相同行 |
-f | 忽略大小写 |
示例:
sort -t' ' -n -r -k2 sort.txt
// 表示对sort.txt文件排序,文件按照' '分隔符来,第二列按照数值排序,倒序排列
sort -t' ' -n -k2 sort.txt
// 与上例子差不多
文本分析键 | 含义 |
---|---|
wc | 全称word count,单词统计 |
-c | 统计文件所有的字节数 |
cat -A file | 可以查看到文件所有字节,包括cat file不可见的 |
-m | 统计文件字符数 |
-l | 统计文件中的行数 |
-w | 统计文件中的单词数 |
示例:单一的wc命令的结果会附加上文件,要想去除文件名,需要使用管道来过滤
wc sort.txt // 默认显示所有行数,单词数,字节数
wc -c sort.txt // 显示所有字节数
wc -m sort.txt // 显示所有字符数
wc -l sort.txt // 显示文件的行数
// 管道过滤文件名
cat sort.txt | wc -c // 显示所有字节数,过滤文件名
sed命令 | 含义 |
---|---|
sed | 行编辑器 |
-n | 静默模式,不再默认显示模式空间中的内容 |
-i | 直接修改原文件 |
-e | 可以同时执行多个脚本 |
-r | 表示使用扩展正则表达式 |
d | 删除符合条件的行 |
p | 显示符合条件的行 |
2a\string | 表示在第二行的行后面追加新行,内容为string |
2i\string | 表示在第二行的行前面追加新行,内容为string |
s/pattern/string/ | vi编辑其中的替换同样有效 |
/str/ | 查找指定行 |
示例:
sed -i "2p" sort.txt // 复制第二行的内容并写入文件
sed -n "2p" sort.txt // 静默模式,只显示当前的内容
sed "2d" sort.txt // 删除第二行内容
sed "/hello/d" sort.txt // 删除指定的hello
sed "2a\hello" sort.txt // 在第二行之后添加hello
sed "2i\hello" sort.txt // 在第二行之前添加hello
sed "s/\(id:\)[0-9]\(:initdefault:\)/\18\2/" inittab
// 在inittab中利用正则表达式查找内容并替换
sed利用正则表达式实现ip地址的匹配并修改IP地址:
示例:
解释一下如何匹配标准的IP地址,都知道IP地址由4段组成,地址理论上是可以为255.255.255.255,但是在实际的生活中我们所见的IP地址由为8.8.8.8的,也有192.168.87.101等等。
分析得到:
位数 | 取值范围 |
---|---|
1 | [0-9] |
2 | [1-9][0-9] |
3 | 1[0-9][0-9] |
3 | 2[0-4][0-9] |
3 | 25[0-5] |
由上述分析可以得到:匹配修改我们linux的IP地址可以直接使用
sed "s/\(IPADDR=\(\([0-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\.\)\{3\}\).*/\199/" -i ifcfg-eth0
sed "s/\(IPADDR=\(\([0-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\.\)\{3\}\).*/\199/" -i ifcfg-eth0
// 上述的可以直接写入,使用的是正则表达式
awk常用的形式:awk -F':' '{pattern+action} fileName'
,其中-F
表示是否需要以特定字符分割行,注意,次数必须使用单引号,因为有些内容需要双引号来表示需要输出!
awk命令 | 含义 |
---|---|
awk | 文本分析工具 |
NR | 表示行号 |
NF | 表示这一行的列数 |
示例:
// 显示/etc/passwd的账户
awk -F':' '{print $1}' passwd // 表示以:分割,打印出第一列
cut -d':' -f1 passwd // cut也能实现
// 只显示账户与shell列(第七列)
awk -F':' '{print $1 "\t" $7}' passwd // 以:分割,打印第一和第七列
// 显示账户和shell列,并且头部添加name/shell,尾部添加blue,/bin/bash
awk -F':' BEGIN'{ "name\tshell"} {print $1 "\t" $7} END{ "blue,\t/bin/bash"}' passwd
// 统计passwd文件中,每行的行号,每行的列数,对应的完整行内容
awk -F':' '{print NR "\t" NF "\t" $0}' passwd // NR行号,NF列数,$0这一行的所有内容
// 查询含有root的行,打印这一行
awk '/root/{print $0}' passwd // 不需要分割所以不使用-F,/root/表示查找 $0表示一行内容
awk的报表功能:统计如下报表中所有人一月份的工资,0为manager,1为worker
Tom 0 2012-12-11 car 3000
John 1 2013-01-13 bike 1000
vivi 1 2013-01-18 car 2800
Tom 0 2013-01-20 car 2500
John 1 2013-01-28 bike 3500
------------------结果为------------
vivi worker 2800
Tom manager 2500
John worker 4500
实现:
awk '{split($3,date,"-");if(date[2]=="01"){name[$1]+=$5};}END{for( i in name){print i "\t" name[i]}} ' awk.txt
解释:首先分割日期,使用date
来存储,分隔符为-
,如果date[2]为01,表示一月份,此时将工资放入name
中,也就是名字$1
与工资$5
对应,同名相加。最后遍历输出即可。
此时得出的结果是
vivi 2800
Tom 2500
John 4500
实现角色写入,由于角色是需要在大前提01月份,所以实现如下:
awk '{split($3,date,"-");if(date[2]=="01"){name[$1]+=$5};if($2=="0"){role[$1]="manager"}else{role[$1]="worker"}}END{for(i in name){print i "\t" role[i] "\t" name[i]}}' awk.txt
解释:在01前提下判断,如果为0则是manager,1则是work,存入role
中,遍历时候打印出即可。
结果:
vivi worker 2800
Tom manager 2500
John worker 4500
实现脚本实现,vi awk.sh
创建脚本文件,将上诉语句拷贝进入,按照java格式排版即可。
使用命令awk -f awk.sh awk.txt
即可得到数据;
解释:-f
是awk命令要求的读取脚本需要的,awk.txt是需要执行的文本。
4.用户与权限
用户与权限 | 含义 |
---|---|
useradd | 创建新用户 |
passwd | 设置/修改用户密码 |
chown | 改变属主与属组 |
chmod | 给相关组中的成员添加相关的权限 |
rwx | 读read写write执行execute |
id | 打印真实且有效的用户和组id |
usermod | 修改用户的账户 |
chmod augo | 其中augo表示all,user,group,others |
具体实例:
useradd test01 // 创建01角色
useradd test02 // 创建02角色
passwd test01 // 修改密码
mkdir share // 创建share文件夹
groupadd share // 将share添加进组
usermod -G share sxt03 // 将test01放入到share组
chown root:share /share // 改变share的属组为share
chmod g+w share // 给share属组添加写的权限
chmod o-x share // 给share目录其他拥有用户执行权限关闭
---------------------------------------------------------
权限的修改可以使用数字
rwx // r代表4,w代表2,x代表1,赋予所有权限则777
5.小结
这里主要学习linux的vi编辑器的一些常用的命令,对于自己以后的操作会更加的有效率一些,正则表达式主要是为了文本分析,在vi中获取到我们想要的数据,使用sed命令或者aux命令来获取到我们想要的那些数据以及aux报表,对于linux的用户与权限的添加与删除,组的添加与删除,相关文件的访问权限等等。大数据之路漫长,加油~~