大数据

1-02 linux 系统
1-04 局域网工作机制和网络地址配置

IP 192.168.33.2
NETMASK 255.255.255.0
GATEWAY 网关路由器地址 192.168.33.1
DNS 域名解析服务器 写网关
子网掩码是判断IP是否在一个网段:IP&&NETMASK 192.168.33.0 网段
本地文件hosts
C:\windows\system32\drivers\etc
重启网络服务:service network restart

在这里插入图片描述
在这里插入图片描述

1-05 vmware虚拟网络的配置

NAT 相当于路由器
vmnet8 虚拟网卡

netstat -nltp

1-09 文件权限操作

1、linux文件权限的描述格式解读
drwxr-xr-x
d:标识节点类型(d:文件夹,-:文件 l:链接)
第一组rwx:表示这个文件的拥有者对它的权限:可读可写可执行
第二组r-x:表示这个文件的所属组对它的权限:可读,不可写,可执行
第三组r-w:表示这个文件的其他用户(相对于上面两类用户)对它的权限:可读,不可写,可执行
2、修改文件权限:
chmod g-rw haha.bat 让组里减掉rw权限
chmod o-rw haha.bat 让其他减掉rw权限
chmod u+x haha.bat 让所属用户增加x权限
可用数字的方式来修改权限:
111 101 101 --> 755
将文件夹所有内容权限统一修改,可用-R参数
chmod -R 770 aaa/
脚本:
#!/bin/bash
while true
do
echo "nimeia i love you"
sleep 1
done

1-10 常用系统操作命令

基本的用户管理
1、添加用户
useradd angle
passwd angle
2、查看在哪个目录
pwd
3、更改组,必须root权限
chown angle:angle aaa/
4、切换user
su ***

系统命令:
1.查看主机名
hostname

2.修改主机名(重启后无效)
hostname hadoop

3.修改主机名(重启后永久生效)
vi /ect/sysconfig/network

4.修改IP(重启后无效)
ifconfig eth0 192.168.12.22

5.修改IP(重启后永久生效)
vi /etc/sysconfig/network-scripts/ifcfg-eth0

6.查看系统信息
uname -a
uname -r

7.查看ID命令
id -u
id -g

8.日期
date
date +%Y-%m-%d
date +%T
date +%Y-%m-%d" "%T

9.日历
cal 2012

10.查看文件信息
file filename

11.挂载硬盘
mount
umount
加载windows共享
mount -t cifs //192.168.1.100/tools /mnt

12.查看文件大小
du -h
du -ah

13.查看分区
df -h

14.ssh
ssh hadoop@192.168.1.1

15.关机
shutdown -h now /init 0
shutdown -r now /reboot

1-11 ssh免密登陆配置

服务器之间的操作:
1、从一个机器拷贝到另一个机器下
scp install.log root@192.168.33.111:/home/
SSH 远程登录的安全外壳协议,有两种身份验证机制:
1、用户名+密码验证
2、密钥验证
生成密钥:
ssh-keygen
方法1:
cd .ssh
scp id_rsa.pub 192.168.33.111:/root
方案2:
ssh-copy-id 192.168.33.111
免密码:
ssh 192.168.33.111

day02 自动化部署高级文本命令
2-01 关于crt中文乱码问题–虚拟机克隆后网卡问题
2-02 查看文件内容–系统服务管理–系统启动级别

linux的命令操作

1、日常操作命令  

**查看当前所在的工作目录
pwd

**查看当前系统的时间 
date

**查看有谁在线(哪些人登陆到了服务器)
who  查看当前在线
last 查看最近的登陆历史记录


2、文件系统操作
**
ls /    查看根目录下的子节点(文件夹和文件)信息
ls -al  -a是显示隐藏文件   -l是以更详细的列表形式显示

**切换目录
cd  /home

**创建文件夹
mkdir aaa     这是相对路径的写法 
mkdir -p aaa/bbb/ccc
mkdir  /data    这是绝对路径的写法 

**删除文件夹
rmdir   可以删除空目录
rm -r aaa   可以把aaa整个文件夹及其中的所有子节点全部删除
rm -rf aaa   强制删除aaa

**修改文件夹名称
mv aaa angelababy

**创建文件
touch  somefile.1   创建一个空文件
echo "i miss you,my baby" > somefile.2  利用重定向“>”的功能,将一条指令的输出结果写入到一个文件中,会覆盖原文件内容
echo "huangxiaoming ,gun dan" >> somefile.2     将一条指令的输出结果追加到一个文件中,不会覆盖原文件内容

用vi文本编辑器来编辑生成文件
******最基本用法
vi  somefile.4
1、首先会进入“一般模式”,此模式只接受各种快捷键,不能编辑文件内容
2、按i键,就会从一般模式进入编辑模式,此模式下,敲入的都是文件内容
3、编辑完成之后,按Esc键退出编辑模式,回到一般模式;
4、再按:,进入“底行命令模式”,输入wq命令,回车即可

******一些常用快捷键
一些有用的快捷键(在一般模式下使用):
a  在光标后一位开始插入
A   在该行的最后插入
I   在该行的最前面插入
gg   直接跳到文件的首行
G    直接跳到文件的末行
dd   删除行,如果  5dd   ,则一次性删除光标后的5行
yy  复制当前行,  复制多行,则  3yy,则复制当前行附近的3行
p   粘贴
v  进入字符选择模式,选择完成后,按y复制,按p粘贴
ctrl+v  进入块选择模式,选择完成后,按y复制,按p粘贴
shift+v  进入行选择模式,选择完成后,按y复制,按p粘贴

查找并替换(在底行命令模式中输入)
%s/sad/88888888888888     效果:查找文件中所有sad,替换为88888888888888
/you       效果:查找文件中出现的you,并定位到第一个找到的地方,按n可以定位到下一个匹配位置(按N定位到上一个)

*****拷贝文件
cp  somefile.1   /home/hadoop/

*****查看文件内容
cat    somefile    一次性将文件内容全部输出(控制台)
more   somefile     可以翻页查看, 下翻一页(空格)    上翻一页(b)   退出(q)
less   somefile      可以翻页查看,下翻一页(空格)    上翻一页(b),上翻一行(↑)  下翻一行(↓)  可以搜索关键字(/keyword)

tail -10  install.log   查看文件尾部的10行
tail -f install.log    小f跟踪文件的唯一inode号,就算文件改名后,还是跟踪原来这个inode表示的文件
tail -F install.log    大F按照文件名来跟踪

head -10  install.log   查看文件头部的10行

3、文件权限的操作

****linux文件权限的描述格式解读
drwxr-xr-x      (也可以用二进制表示  111 101 101  -->  755)

d:标识节点类型(d:文件夹   -:文件  l:链接)
r:可读   w:可写    x:可执行 
第一组rwx:  表示这个文件的拥有者对它的权限:可读可写可执行
第二组r-x:  表示这个文件的所属组对它的权限:可读,不可写,可执行
第三组r-x:  表示这个文件的其他用户(相对于上面两类用户)对它的权限:可读,不可写,可执行


****修改文件权限
chmod g-rw haha.dat    表示将haha.dat对所属组的rw权限取消
chmod o-rw haha.dat 	表示将haha.dat对其他人的rw权限取消
chmod u+x haha.dat      表示将haha.dat对所属用户的权限增加x

也可以用数字的方式来修改权限
chmod 664 haha.dat   
就会修改成   rw-rw-r--

如果要将一个文件夹的所有内容权限统一修改,则可以-R参数
chmod -R 770 aaa/
chown angela:angela aaa/    <只有root能执行>


4、基本的用户管理

*****添加用户
useradd  angela
要修改密码才能登陆 
passwd angela  按提示输入密码即可


**为用户配置sudo权限
用root编辑 vi /etc/sudoers
在文件的如下位置,为hadoop添加一行即可
root    ALL=(ALL)       ALL     
hadoop  ALL=(ALL)       ALL

然后,hadoop用户就可以用sudo来执行系统级别的指令
[hadoop@shizhan ~]$ sudo useradd huangxiaoming


5、系统管理操作
*****查看主机名
hostname
****修改主机名(重启后无效)
hostname hadoop

*****修改主机名(重启后永久生效)
vi /ect/sysconfig/network
****修改IP(重启后无效)
ifconfig eth0 192.168.12.22

****修改IP(重启后永久生效)
vi /etc/sysconfig/network-scripts/ifcfg-eth0


mount ****  挂载外部存储设备到文件系统中
mkdir   /mnt/cdrom      创建一个目录,用来挂载
mount -t iso9660 -o ro /dev/cdrom /mnt/cdrom/     将设备/dev/cdrom挂载到 挂载点 :  /mnt/cdrom中

*****umount
umount /mnt/cdrom


*****统计文件或文件夹的大小
du -sh  /mnt/cdrom/Packages
df -h    查看磁盘的空间
****关机
halt
****重启
reboot


******配置主机之间的免密ssh登陆
假如 A  要登陆  B
在A上操作:
%%首先生成密钥对
ssh-keygen   (提示时,直接回车即可)
%%再将A自己的公钥拷贝并追加到B的授权列表文件authorized_keys中
ssh-copy-id   B



******后台服务管理
service network status   查看指定服务的状态
service network stop     停止指定服务
service network start    启动指定服务
service network restart  重启指定服务
service --status-all  查看系统中所有的后台服务

设置后台服务的自启配置
chkconfig   查看所有服务器自启配置
chkconfig iptables off   关掉指定服务的自动启动
chkconfig iptables on   开启指定服务的自动启动


*****系统启动级别管理
vi  /etc/inittab

# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:

2-03 压缩解压缩–jdk安装

软件安装

1、如何上传安装包到服务器
**可以使用图形化工具,如: filezilla
**可以使用sftp工具:  alt+p 调出后,用put命令上传
上传(如果不cd指定目录,则上传到当前用户的主目录):
sftp> cd /home/   
sftp> put C:\Users\Administrator\Desktop\day02\soft\jdk-7u45-linux-x64.tar.gz
下载(lcd指定下载到本地的目标路径)
sftp> lcd d:/                            
sftp> get /home/jdk-7u45-linux-x64.tar.gz

**lrzsz

2、安装jdk
**压缩解压缩的相关命令****
%%压缩解压缩%%
root@mini1 ~]# gzip access.log 
[root@mini1 ~]# ll
总用量 134892
-rw-r--r--. 1 root root        68 4月   3 17:37 access.log.gz

解压gz文件:  gzip -d access.log.gz

%%打包解包%%
[root@mini1 ~]# tar -cvf myfirsttarball.tar aaa/
aaa/
aaa/2.txt
aaa/3.txt
aaa/1.txt

解包:
[root@mini1 ~]# tar -xvf myfirsttarball.tar 
aaa/
aaa/2.txt
aaa/3.txt
aaa/1.txt


%%一次性完成打包&&压缩的操作%%
产生压缩包:
[root@mini1 ~]# tar -zcvf my.tar.gz aaa/
aaa/
aaa/2.txt
aaa/3.txt
aaa/1.txt

解压缩包:
[root@mini1 ~]# tar -zxvf my.tar.gz 
aaa/
aaa/2.txt
aaa/3.txt
aaa/1.txt



##########安装jdk的过程:
**解压安装包
 tar -zxvf jdk-7u45-linux-x64.tar.gz -C apps/
**然后修改环境变量
vi /etc/profile
在文件最后添加
export JAVA_HOME=/root/apps/jdk1.7.0_45
export PATH=$PATH:$JAVA_HOME/bin
保存退出

**然后重新加载环境变量
source /etc/profile



3、安装rpm包软件,如mysql
%%查看系统中安装的rpm包
rpm -qa | grep mysql



%%上传rpm安装包
MySQL-client-5.5.48-1.linux2.6.x86_64.rpm
MySQL-server-5.5.48-1.linux2.6.x86_64.rpm
per * .rpm

%%安装perl依赖
rpm -ivh perl*
《可能会提示有包冲突,解决: rpm -e 冲突包名 --nodeps 》

%%安装server
rpm -ivh MySQL-server-5.5.48-1.linux2.6.x86_64.rpm
如果成功,会看到进度条,最后,有关于root密码设置的提示,一定要记下来
这个版本的提示是,先启动server
service mysql start
然后/usr/bin/mysql_secure_installation 命令去交互式修改root密码

%%修改密码时,提示需要先安装client
rpm -ivh MySQL-client-5.5.48-1.linux2.6.x86_64.rpm

客户端安装成功后,记得还要用/usr/bin/mysql_secure_installation 命令去交互式修改root密码

%%登录验证
mysql -uroot -proot

指定解压到apps下:
tar -zxvf jdk-7u45-linux-x64.tar.gz -C apps/
指定路径:
echo $PATH
/home/gordon/apps/jdk1.7.0_45/bin
环境变量配置
export JAVA_HOME=/home/gordon/apps/jdk1.7.0_45
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile

2-04 jdk-mysql-tomcat-yum本地源

查询系统中安装的rpm包
rpm -qa | grep mySql

2-05 iptables的常用操作

防火墙

2-06 shell编程的变量定义

系统变量:
$HOME、$PWD、 $SHELL、 $USER
root@ubuntu:/home/gordon/dashuju/shell# echo $HOME
/root
root@ubuntu:/home/gordon/dashuju/shell# echo $PWD
/home/gordon/dashuju/shell
root@ubuntu:/home/gordon/dashuju/shell# echo $SHELL
/bin/bash
root@ubuntu:/home/gordon/dashuju/shell# echo $USER
root
root@ubuntu:/home/gordon/dashuju/shell# 
当前系统中所有变量:set
自定义变量:
#!/bin/bash
aa="hello"
sleep 20
x="hello\world"
echo $x
脱意:
root@ubuntu:/home/gordon/dashuju/shell# x="hello\world"
root@ubuntu:/home/gordon/dashuju/shell# echo $x
hello\world
root@ubuntu:/home/gordon/dashuju/shell# x="hello\nworld"
root@ubuntu:/home/gordon/dashuju/shell# echo $x
hello\nworld
root@ubuntu:/home/gordon/dashuju/shell# y=hello
root@ubuntu:/home/gordon/dashuju/shell# echo $y
hello
root@ubuntu:/home/gordon/dashuju/shell# z='hello world'
root@ubuntu:/home/gordon/dashuju/shell# echo $z
hello world
root@ubuntu:/home/gordon/dashuju/shell# q=bb
root@ubuntu:/home/gordon/dashuju/shell# w="hello $q"
root@ubuntu:/home/gordon/dashuju/shell# echo $w
hello bb
root@ubuntu:/home/gordon/dashuju/shell# a='hello $s'
root@ubuntu:/home/gordon/dashuju/shell# s=cc
root@ubuntu:/home/gordon/dashuju/shell# echo $a
hello $s
单引号脱意更彻底,将所有特殊字符全部脱意
撤销变量: unset a
readonly b=2 声明静态变量
export c=2 全局变量
统计字节数:
root@ubuntu:/home/gordon/dashuju/shell# wc -c testdot.sh 
32 testdot.sh
返回值赋值:2种形式
root@ubuntu:/home/gordon/dashuju/shell# aaa=`wc -c testdot.sh | cut -d ' ' -f1`
root@ubuntu:/home/gordon/dashuju/shell# echo $aaa
32
root@ubuntu:/home/gordon/dashuju/shell# bbb=$(wc -c testdot.sh | cut -d ' ' -f1) 
root@ubuntu:/home/gordon/dashuju/shell# echo $bbb
32

在这里插入图片描述
在这里插入图片描述
2-07 shell编程的基本语法

root@ubuntu:/home/gordon/dashuju/shell# echo $(ls -la)
total 12 drwxrwxr-x 2 gordon gordon 4096 Jan 11 07:23 . drwxrwxr-x 3 gordon gordon 4096 Jan 11 07:11 .. -rwxrwxrwx 1 gordon gordon 32 Jan 11 07:18 testdot.sh
root@ubuntu:/home/gordon/dashuju/shell# 
$?:返回0,上条命令执行成功,>0 ,失败
root@ubuntu:/home/gordon/dashuju/shell# ls -la
total 12
drwxrwxr-x 2 gordon gordon 4096 Jan 11 07:23 .
drwxrwxr-x 3 gordon gordon 4096 Jan 11 07:11 ..
-rwxrwxrwx 1 gordon gordon   32 Jan 11 07:18 testdot.sh
root@ubuntu:/home/gordon/dashuju/shell# echo $?
0
$$:当前进程编号
$0:表示当前脚本名称
$n:表示n位置的输入参数(n代表数字,n>=1)
#!/bin/bash
aa="hello"
echo "first = "$1
echo "second = "$2
root@ubuntu:/home/gordon/dashuju/shell# ./testdot.sh sun yang
first = sun
second = yang
$#:表示变量的个数,常用于循环

$*和$@都表示参数列表:
#!/bin/bash
aa="hello"
echo '$*'
echo $*
echo '$@'
echo $@
~
~
root@ubuntu:/home/gordon/dashuju/shell# ./testdot.sh ni hao a ni shi
$*
ni hao a ni shi
$@
ni hao a ni shi

for循环:
#!/bin/bash
aa="hello"
echo '$*'
for p in $*
do
echo $p
done
方案2
echo $*

echo '$@'
for p in $@
do
echo $p
done
echo $@
加了“”,“$*”会看做一个字符串
for p in "$*"
do
echo $p
done
加了“”,“$@”会看做一个一个字符
for p in "$@"
do
echo $p
done

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

while [ 2 -gt 1 ]; do echo aaa; done

在这里插入图片描述

在这里插入图片描述

root@ubuntu:/home/gordon/dashuju/shell# s=`expr 2 + 3`
root@ubuntu:/home/gordon/dashuju/shell# res=`expr $s \* 4`
root@ubuntu:/home/gordon/dashuju/shell# echo $res
20
$(((2+3)*4))

在这里插入图片描述

#!/bin/sh
case $1 in
start)
    echo "starting"
    ;;
stop)
    echo "stoping"
    ;;
*)
    echo "usage: {start|stop}"
esac

在这里插入图片描述

root@ubuntu:/home/gordon/dashuju/shell# read -p "please input:" x
please input:sunyang

在这里插入图片描述

在这里插入代码片

在这里插入图片描述
在这里插入图片描述

 [ haha ] && echo ok || echo no
 ok

在这里插入图片描述
在这里插入图片描述

[ -f test.sh ] 

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2-08 高级文本处理命令的引入
2-09 高级文本处理命令之cut-sort-wc

sort
sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出。如果 File 参数指定多个文件,那么 sort 命令将这些文件连接起来,并当作一个文件进行排序。

sort语法

 
[root@www ~]# sort [-fbMnrtuk] [file or stdin]
选项与参数:
-f  :忽略大小写的差异,例如 A 与 a 视为编码相同;
-b  :忽略最前面的空格符部分;
-M  :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
-n  :使用『纯数字』进行排序(默认是以文字型态来排序的);
-r  :反向排序;
-u  :就是 uniq ,相同的数据中,仅出现一行代表;
-t  :分隔符,默认是用 [tab] 键来分隔;
-k  :以那个区间 (field) 来进行排序的意思
 

对/etc/passwd 的账号进行排序
[root@www ~]# cat /etc/passwd | sort
adm:x:3:4:adm:/var/adm:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
sort 是默认以第一个数据来排序,而且默认是以字符串形式来排序,所以由字母 a 开始升序排序。

 

/etc/passwd 内容是以 : 来分隔的,我想以第三栏来排序,该如何

[root@www ~]# cat /etc/passwd | sort -t ':' -k 3
root:x:0:0:root:/root:/bin/bash
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
默认是以字符串来排序的,如果想要使用数字排序:

cat /etc/passwd | sort -t ':' -k 3n
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
默认是升序排序,如果要倒序排序,如下

cat /etc/passwd | sort -t ':' -k 3nr
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
ntp:x:106:113::/home/ntp:/bin/false
messagebus:x:105:109::/var/run/dbus:/bin/false
sshd:x:104:65534::/var/run/sshd:/usr/sbin/nologin
 

如果要对/etc/passwd,先以第六个域的第2个字符到第4个字符进行正向排序,再基于第一个域进行反向排序。

cat /etc/passwd |  sort -t':' -k 6.2,6.4 -k 1r      
sync:x:4:65534:sync:/bin:/bin/sync
proxy:x:13:13:proxy:/bin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
 

查看/etc/passwd有多少个shell:对/etc/passwd的第七个域进行排序,然后去重:

cat /etc/passwd |  sort -t':' -k 7 -u
root:x:0:0:root:/root:/bin/bash
syslog:x:101:102::/home/syslog:/bin/false
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
sshd:x:104:65534::/var/run/sshd:/usr/sbin/nologin
 

uniq
 uniq命令可以去除排序过的文件中的重复行,因此uniq经常和sort合用。也就是说,为了使uniq起作用,所有的重复行必须是相邻的。

uniq语法

[root@www ~]# uniq [-icu]
选项与参数:
-i   :忽略大小写字符的不同;
-c  :进行计数
-u  :只显示唯一的行
 

testfile的内容如下

 
cat testfile
hello
world
friend
hello
world
hello
 
 

直接删除未经排序的文件,将会发现没有任何行被删除

 
#uniq testfile  
hello
world
friend
hello
world
hello
 
 

排序文件,默认是去重

#cat testfile | sort |uniq
friend
hello
world
 

排序之后删除了重复行,同时在行首位置输出该行重复的次数

#sort testfile | uniq -c
1 friend
3 hello
2 world
 

仅显示存在重复的行,并在行首显示该行重复的次数

#sort testfile | uniq -dc
3 hello
2 world
 

仅显示不重复的行

sort testfile | uniq -u
friend  
 

cut
cut命令可以从一个文本文件或者文本流中提取文本列。

cut语法

[root@www ~]# cut -d'分隔字符' -f fields <==用于有特定分隔字符
[root@www ~]# cut -c 字符区间            <==用于排列整齐的信息
选项与参数:
-d  :后面接分隔字符。与 -f 一起使用;
-f  :依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思;
-c  :以字符 (characters) 的单位取出固定字符区间;
 

PATH 变量如下

[root@www ~]# echo $PATH
/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games
# 1 | 2       | 3   | 4       | 5            | 6            | 7
 

将 PATH 变量取出,我要找出第五个路径。

#echo $PATH | cut -d ':' -f 5
/usr/local/bin
 

将 PATH 变量取出,我要找出第三和第五个路径。

#echo $PATH | cut -d ':' -f 3,5
/sbin:/usr/local/bin
 

将 PATH 变量取出,我要找出第三到最后一个路径。

echo $PATH | cut -d ':' -f 3-
/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games
 

将 PATH 变量取出,我要找出第一到第三个路径。

#echo $PATH | cut -d ':' -f 1-3
/bin:/usr/bin:/sbin:
 
 

将 PATH 变量取出,我要找出第一到第三,还有第五个路径。

echo $PATH | cut -d ':' -f 1-3,5
/bin:/usr/bin:/sbin:/usr/local/bin
 

实用例子:只显示/etc/passwd的用户和shell

#cat /etc/passwd | cut -d ':' -f 1,7 
root:/bin/bash
daemon:/bin/sh
bin:/bin/sh
 

 wc
统计文件里面有多少单词,多少行,多少字符。

wc语法

[root@www ~]# wc [-lwm]
选项与参数:
-l  :仅列出行;
-w  :仅列出多少字(英文单字);
-m  :多少字符;
 

默认使用wc统计/etc/passwd

#wc /etc/passwd
40   45 1719 /etc/passwd
40是行数,45是单词数,1719是字节数

 

wc的命令比较简单使用,每个参数使用如下:

 
#wc -l /etc/passwd   #统计行数,在对记录数时,很常用
40 /etc/passwd       #表示系统有40个账户

#wc -w /etc/passwd  #统计单词出现次数
45 /etc/passwd

#wc -m /etc/passwd  #统计文件的字符数
1719
 
参考 http://vbird.dic.ksu.edu.tw/linux_basic/0320bash_6.php#pipe_2

      http://www.cnblogs.com/stephen-liu74/archive/2011/11/10/2240461.html

2-10 高级文本处理命令之sed

1. Sed简介
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。以下介绍的是Gnu版本的Sed 3.02。
2. 定址
可以通过定址来定位你所希望编辑的行,该地址用数字构成,用逗号分隔的两个行数表示以这两行为起止的行的范围(包括行数表示的那两行)。如1,3表示1,2,3行,美元符号($)表示最后一行。范围可以通过数据,正则表达式或者二者结合的方式确定 。

3. Sed命令
调用sed命令有两种形式:
*
sed [options] 'command' file(s)
*
sed [options] -f scriptfile file(s)
a\
在当前行后面加入一行文本。
b lable
分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
c\
用新的文本改变本行的文本。
d
从模板块(Pattern space)位置删除行。
D
删除模板块的第一行。
i\
在当前行上面插入文本。
h
拷贝模板块的内容到内存中的缓冲区。
H
追加模板块的内容到内存中的缓冲区
g
获得内存缓冲区的内容,并替代当前模板块中的文本。
G
获得内存缓冲区的内容,并追加到当前模板块文本的后面。
l
列表不能打印字符的清单。
n
读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
N
追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
p
打印模板块的行。
P(大写)
打印模板块的第一行。
q
退出Sed。
r file
从file中读行。
t label
if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
T label
错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
w file
写并追加模板块到file末尾。
W file
写并追加模板块的第一行到file末尾。
!
表示后面的命令对所有没有被选定的行发生作用。
s/re/string
用string替换正则表达式re。
=
打印当前行号码。
#
把注释扩展到下一个换行符以前。
以下的是替换标记
*
g表示行内全面替换。
*
p表示打印行。
*
w表示把行写入一个文件。
*
x表示互换模板块中的文本和缓冲区中的文本。
*
y表示把一个字符翻译为另外的字符(但是不用于正则表达式)

4. 选项
-e command, --expression=command
允许多台编辑。
-h, --help
打印帮助,并显示bug列表的地址。
-n, --quiet, --silent
取消默认输出。
-f, --filer=script-file
引导sed脚本文件名。
-V, --version
打印版本和版权信息。

5. 元字符集^
锚定行的开始 如:/^sed/匹配所有以sed开头的行。 
$
锚定行的结束 如:/sed$/匹配所有以sed结尾的行。 
.
匹配一个非换行符的字符 如:/s.d/匹配s后接一个任意字符,然后是d。 
*
匹配零或多个字符 如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。 
[]
匹配一个指定范围内的字符,如/[Ss]ed/匹配sed和Sed。 
[^]
匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。 
\(..\)
保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。 
&
保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。 
\<
锚定单词的开始,如:/\<love/匹配包含以love开头的单词的行。 
\>
锚定单词的结束,如/love\>/匹配包含以love结尾的单词的行。 
x\{m\}
重复字符x,m次,如:/o\{5\}/匹配包含5个o的行。 
x\{m,\}
重复字符x,至少m次,如:/o\{5,\}/匹配至少有5个o的行。 
x\{m,n\}
重复字符x,至少m次,不多于n次,如:/o\{5,10\}/匹配5--10个o的行。
6. 实例
删除:d命令
*
$ sed '2d' example-----删除example文件的第二行。
*
$ sed '2,$d' example-----删除example文件的第二行到末尾所有行。
*
$ sed '$d' example-----删除example文件的最后一行。
*
$ sed '/test/'d example-----删除example文件所有包含test的行。
替换:s命令
*
$ sed 's/test/mytest/g' example-----在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。
*
$ sed -n 's/^test/mytest/p' example-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。
*
$ sed 's/^192.168.0.1/&localhost/' example-----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost。
*
$ sed -n 's/\(love\)able/\1rs/p' example-----love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。
*
$ sed 's#10#100#g' example-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。
选定行的范围:逗号
*
$ sed -n '/test/,/check/p' example-----所有在模板test和check所确定的范围内的行都被打印。
*
$ sed -n '5,/^test/p' example-----打印从第五行开始到第一个包含以test开始的行之间的所有行。
*
$ sed '/test/,/check/s/$/sed test/' example-----对于模板test和west之间的行,每行的末尾用字符串sed test替换。
多点编辑:e命令
*
$ sed -e '1,5d' -e 's/test/check/' example-----(-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。命令的执 行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。
*
$ sed --expression='s/test/check/' --expression='/love/d' example-----一个比-e更好的命令是--expression。它能给sed表达式赋值。
从文件读入:r命令
*
$ sed '/test/r file' example-----file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。
写入文件:w命令
*
$ sed -n '/test/w file' example-----在example中所有包含test的行都被写入file里。
追加命令:a命令
*
$ sed '/^test/a\\--->this is a example' example    '----->this is a example'被追加到以test开头的行后面,sed要求命令a后面有一个反斜杠。
插入:i命令
$ sed '/test/i\\
new line
-------------------------' example
如果test被匹配,则把反斜杠后面的文本插入到匹配行的前面。
下一个:n命令
*
$ sed '/test/{ n; s/aa/bb/; }' example-----如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续。
变形:y命令
*
$ sed '1,10y/abcde/ABCDE/' example-----把1--10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令。
退出:q命令
*
$ sed '10q' example-----打印完第10行后,退出sed。
保持和获取:h命令和G命令
*
$ sed -e '/test/h' -e '$G example-----在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将 打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保 持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中 的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。
保持和互换:h命令和x命令
*
$ sed -e '/test/h' -e '/check/x' example -----互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换。
7. 脚本
Sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。

2-11 高级文本处理命令之awk

简介
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。

awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。

 

使用方法
awk '{pattern + action}' {filenames}
尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。

awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。

通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。

 

调用awk
有三种方式调用awk

 
1.命令行方式
awk [-F  field-separator]  'commands'  input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。

2.shell脚本方式
将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。
相当于shell脚本首行的:#!/bin/sh
可以换成:#!/bin/awk

3.将所有的awk命令插入一个单独文件,然后调用:
awk -f awk-script-file input-file(s)
其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。
 
 本章重点介绍命令行方式。

 

入门实例
假设last -n 5的输出如下

[root@www ~]# last -n 5 <==仅取出前五行
root     pts/1   192.168.1.100  Tue Feb 10 11:21   still logged in
root     pts/1   192.168.1.100  Tue Feb 10 00:46 - 02:28  (01:41)
root     pts/1   192.168.1.100  Mon Feb  9 11:41 - 18:30  (06:48)
dmtsai   pts/1   192.168.1.100  Mon Feb  9 11:41 - 11:41  (00:00)
root     tty1                   Fri Sep  5 14:09 - 14:10  (00:01)
如果只是显示最近登录的5个帐号

#last -n 5 | awk  '{print $1}'
root
root
root
dmtsai
root
awk工作流程是这样的:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或 "[tab]键",所以$1表示登录用户,$3表示登录用户ip,以此类推。

 

如果只是显示/etc/passwd的账户

#cat /etc/passwd |awk  -F ':'  '{print $1}'  
root
daemon
bin
sys
这种是awk+action的示例,每行都会执行action{print $1}。

-F指定域分隔符为':'。

 

如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割

#cat /etc/passwd |awk  -F ':'  '{print $1"\t"$7}'
root    /bin/bash
daemon  /bin/sh
bin     /bin/sh
sys     /bin/sh
 

如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"。

 
cat /etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}'
name,shell
root,/bin/bash
daemon,/bin/sh
bin,/bin/sh
sys,/bin/sh
....
blue,/bin/nosh
 
awk工作流程是这样的:先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。

 

搜索/etc/passwd有root关键字的所有行

#awk -F: '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
这种是pattern的使用示例,匹配了pattern(这里是root)的行才会执行action(没有指定action,默认输出每行的内容)。

搜索支持正则,例如找root开头的: awk -F: '/^root/' /etc/passwd

 

搜索/etc/passwd有root关键字的所有行,并显示对应的shell

# awk -F: '/root/{print $7}' /etc/passwd             
/bin/bash
 这里指定了action{print $7}

 

awk内置变量
awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。

 
ARGC               命令行参数个数
ARGV               命令行参数排列
ENVIRON            支持队列中系统环境变量的使用
FILENAME           awk浏览的文件名
FNR                浏览文件的记录数
FS                 设置输入域分隔符,等价于命令行 -F选项
NF                 浏览记录的域的个数
NR                 已读的记录数
OFS                输出域分隔符
ORS                输出记录分隔符
RS                 控制记录分隔符
 
 此外,$0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推。

 

统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:

#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替代print,可以让代码更加简洁,易读

 awk  -F ':'  '{printf("filename:%s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
 

print和printf
awk中同时提供了print和printf两种打印输出的函数。

其中print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。

printf函数,其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

 awk编程
 变量和赋值

除了awk的内置变量,awk还可以自定义变量。

下面统计/etc/passwd的账户人数

awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
......
user count is  40
count是自定义变量。之前的action{}里都是只有一个print,其实print只是一个语句,而action{}可以有多个语句,以;号隔开。

 

这里没有初始化count,虽然默认是0,但是妥当的做法还是初始化为0:

awk 'BEGIN {count=0;print "[start]user count is ", count} {count=count+1;print $0;} END{print "[end]user count is ", count}' /etc/passwd
[start]user count is  0
root:x:0:0:root:/root:/bin/bash
...
[end]user count is  40
 

统计某个文件夹下的文件占用的字节数

ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'
[end]size is  8657198
 

如果以M为单位显示:

ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size/1024/1024,"M"}' 
[end]size is  8.25889 M
注意,统计不包括文件夹的子目录。

 

条件语句

 awk中的条件语句是从C语言中借鉴来的,见如下声明方式:

 
if (expression) {
    statement;
    statement;
    ... ...
}

if (expression) {
    statement;
} else {
    statement2;
}

if (expression) {
    statement1;
} else if (expression1) {
    statement2;
} else {
    statement3;
}
 
 

统计某个文件夹下的文件占用的字节数,过滤4096大小的文件(一般都是文件夹):

ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size=size+$5;}} END{print "[end]size is ", size/1024/1024,"M"}' 
[end]size is  8.22339 M
 

循环语句

awk中的循环语句同样借鉴于C语言,支持while、do/while、for、break、continue,这些关键字的语义和C语言中的语义完全相同。

 

数组

  因为awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key)。值和关键字都存储在内部的一张针对key/value应用hash的表格里。由于hash不是顺序存储,因此在显示数组内容时会发现,它们并不是按照你预料的顺序显示出来的。数组和变量一样,都是在使用时自动创建的,awk也同样会自动判断其存储的是数字还是字符串。一般而言,awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等。

 

显示/etc/passwd的账户

 
awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
0 root
1 daemon
2 bin
3 sys
4 sync
5 games
......
 
这里使用for循环遍历数组

awk编程的内容极多,这里只罗列简单常用的用法,更多请参考 http://www.gnu.org/software/gawk/manual/gawk.html

2-12 高并发网站架构
2-13 nginx和keepalived部署安装的流程解析

3 集群部署 zookeeper
3-01 关于yum网络版仓库和scp命令缺失的问题
**3-02 自动化部署脚本 **
**3-03 zookeeper的功能和应用场景 **
**3-04 zookeeper的集群角色分配原理 **
3-05 zookeeper集群的搭建
3-06 zookeeper的命令行客户端及znode数据结构类型监听等功能
**3-07 zookeeper集群自动启动脚本及export变量作用域的解析 **
3-08 zookeeper的java客户端api
**3-09 zookeeper的java客户端api2 **
**3-10 分布式应用系统服务器上下线动态感知程序开发 **
**3-11 zookeeper客户端线程的属性–守护线程 **
**3-12 分布式应用系统程序效果测试 **
**3-13 分布式共享锁的程序逻辑流程 **

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值