- 服务器资源操作
- 操作使用技巧
- 文件系统、打包压缩、软件包操作
- 文件系统结构和基本操做命令
- find命令:查找文件
- ln命令:创建符号连接文件
- mount命令
- mkdir命令:创建目录
- umask命令:文件默认权限
- which命令:在$PATH变量指定的路径中查找文件
- locate命令:基于“/var/lib/mlocate/mlocate.db”这个数据库查找文件
- file命令:打印推测获得的文件类型
- stat命令:打印文件信息
- basename命令:去除路径前缀和后缀
- dirname命令:获取路径的目录部分
- du命令:查看文件大小
- sed文本操做命令使用
- awk命令使用
- grep命令:从文件中查找匹配模式的行
- cat、more、less、tail、head命令
- tr命令:删除,去重,替换文本内容ap
- sort/uniq/cut/wc命令
- split命令:切分文件
- comm命令:对于两个已排序文件,逐行比对
- join命令:根据两行中具备相同值的两个字段,将该两行内容拼接成一行打印输出
服务器资源操作
系统常规运维命令
cat /etc/issue 查看系统版本
cat /etc/redhat-release 查看系统版本
getconf LONG_BIT 查看系统的位数(32bit or 64bit)
arch 显示机器的处理器架构
uname -m 显示机器的处理器架构
uname -r 显示正在使用的内核版本
dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI)
hdparm -i /dev/hda 罗列一个磁盘的架构特性
hdparm -tT /dev/sda 在磁盘上执行测试性读取操做
cat /proc/cpuinfo 显示CPU info的信息
cat /proc/interrupts 显示中断
cat /proc/meminfo 校验内存使用
cat /proc/swaps 显示哪些swap被使用
cat /proc/version 显示内核的版本
cat /proc/net/dev 显示网络适配器及统计
cat /proc/mounts 显示已加载的文件系统
lspci -tv 罗列 PCI 设备
lsusb -tv 显示 USB 设备
cal 2007 显示2007年的日历表
date 041217002007.00 设置日期和时间 - 月日时分年.秒
clock -w 将时间修改保存到 BIOS
echo 1 >/proc/sys/vm/drop_caches 手动释放缓存
echo 1 >/proc/sys/net/ipv4/ip_forward 打开ip路由转发功能
echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all 禁止ping(禁止别人ping本机ip)
ntpdate us.pool.ntp.org 在线更新系统时间
系统最小化安装,没装开发环境,须要yum groupinstall -y "development tools"安装
1.删除0字节文件linux
find-type f -size 0 -exec rm -rf {} \;ios
2.查看进程正则表达式
按内存从大到小排列sql
ps -e -o "%C : %p : %z : %a"|sort -k5 -nrshell
3.按cpu利用率从大到小排列apache
ps -e -o "%C : %p : %z : %a"|sort -nrcentos
4.打印说cache里的URL缓存
grep -r-a jpg /data/cache/* | strings | grep"http:" | awk -F'http:' '{print "http:"$2;}'
5.查看http的并发请求数及其TCP链接状态:
netstat-n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
6. sed -i'/Root/s/no/yes/' /etc/ssh/sshd_config sed在这个文里Root的一行,匹配Root一行,将no替换成yes.
7.1.如何杀掉mysql进程:
ps aux|grep mysql |grep -v grep |awk '{print$2}' |xargs kill -9 (从中了解到awk的用途)
killall -TERMmysqld
kill -9`cat /usr/local/apache2/logs/httpd.pid` 试试查杀进程PID
8.显示运行3级别开启的服务:
ls/etc/rc3.d/S* |cut -c 15- (从中了解到cut的用途,截取数据)
9.如何在编写SHELL显示多个信息,用EOF
cat<< EOF
+--------------------------------------------------------------+
| === Welcome to Tunoff services === |
+--------------------------------------------------------------+
EOF
10. for 的巧用(如给mysql建软连接)
cd/usr/local/mysql/bin
for i in*
do ln/usr/local/mysql/bin/$i /usr/bin/$i
done
11. 取IP地址:
ifconfigeth0 |grep "inet addr:" |awk '{print $2}'|cut -c 6-
或者
ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' |cut -d: -f2 | awk '{ print $1}'
12.内存的大小:
free -m|grep "Mem" | awk '{print $2}'
13.netstat-an -t | grep ":80" | grep ESTABLISHED | awk '{printf "%s%s\n",$5,$6}' | sort
14.查看Apache的并发请求数及其TCP链接状态:
netstat-n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
15.由于同事要统计一下服务器下面全部的jpg的文件的大小,写了个shell给他来统计.原来用xargs实现,但他一次处理一部分,搞的有多个总和....,下面的命令就能解决啦.
find /-name *.jpg -exec wc -c {} \;|awk '{print $1}'|awk '{a+=$1}END{print a}'
CPU的数量(多核算多个CPU,cat/proc/cpuinfo |grep -c processor)越多,系统负载越低,每秒能处理的请求数也越多。
16 CPU负载 # cat /proc/loadavg
检查前三个输出值是否超过了系统逻辑CPU的4倍。
18 CPU负载 #mpstat 1 1
检查%idle是否太低(好比小于5%)
19 内存空间 # free
检查free值是否太低 也能够用 # cat/proc/meminfo
20 swap空间 # free
检查swap used值是否太高 若是swap used值太高,进一步检查swap动做是否频繁:
# vmstat1 5
观察si和so值是否较大
21 磁盘空间 # df -h
检查是否有分区使用率(Use%)太高(好比超过90%) 如发现某个分区空间接近用尽,能够进入该分区的挂载点,用如下命令找出占用空间最多的文件或目录:
# du -cks* | sort -rn | head -n 10
22 磁盘I/O负载 # iostat -x 1 2
检查I/O使用率(%util)是否超过100%
23 网络负载 # sar -n DEV
检查网络流量(rxbyt/s,txbyt/s)是否太高
24 网络错误 # netstat -i
检查是否有网络错误(drop fifocolls carrier) 也能够用命令:# cat/proc/net/dev
25 网络链接数目 # netstat -an | grep -E “^(tcp)” | cut -c68- | sort | uniq -c | sort -n
26 进程总数 # ps aux | wc -l
检查进程个数是否正常 (好比超过250)
27 可运行进程数目 # vmwtat 1 5
列给出的是可运行进程的数目,检查其是否超过系统逻辑CPU的4倍
28 进程 # top -id 1
观察是否有异常进程出现
29 网络状态 检查DNS, 网关等是否能够正常连通
30 用户 # who | wc -l
检查登陆用户是否过多 (好比超过50个) 也能够用命令:# uptime
31 系统日志 # cat /var/log/rflogview/*errors
检查是否有异常错误记录 也能够搜寻一些异常关键字,例如:
# grep -ierror /var/log/messages
# grep -ifail /var/log/messages
32 核心日志 # dmesg
检查是否有异常错误记录
33 系统时间 # date
检查系统时间是否正确
34 打开文件数目 # lsof | wc -l
检查打开文件总数是否过多
35 日志
logwatch –print #配置/etc/log.d/logwatch.conf,将 Mailto 设置为本身的email 地址,启动mail服务(sendmail或者postfix),这样就能够天天收到日志报告了,缺省logwatch只报告昨天的日志
#logwatch –print –range all
#能够用得到全部的日志分析结果。
logwatch –print –detail high
#能够用得到更具体的日志分析结果(而不单单是出错日志)。
36.杀掉80端口相关的进程
lsof -i:80|grep -v "ID"|awk '{print "kill -9",$2}'|sh
37.清除僵死进程。
ps -eal |awk '{ if ($2 == "Z") {print $4}}' | kill -9
38.tcpdump抓包 ,用来防止80端口被人攻击时能够分析数据
# tcpdump-c 10000 -i eth0 -n dst port 80 > /root/pkts
39.而后检查IP的重复数 并从小到大排序 注意 "-t\ +0" 中间是两个空格
# lesspkts | awk {'printf $3"\n"'} | cut -d. -f 1-4 | sort | uniq -c | awk{'printf $1" "$2"\n"'} | sort -n -t\ +0
40.查看有多少个活动的php-cgi进程
netstat-anp | grep php-cgi | grep ^tcp | wc -l
41.查看系统自启动的服务
chkconfig--list | awk '{if ($5=="3:on") print $1}'
42.kudzu查看网卡型号
kudzu--probe --class=network
服务器信息查看
free -m
#-/+ buffers/cache: 6458 1649
#6458M为真实使用内存 1649M为真实剩余内存(剩余内存+缓存+缓冲器)
#linux会利用全部的剩余内存做为缓存,因此要保证linux运行速度,就须要保证内存的缓存大小
系统信息:
uname -a # 查看Linux内核版本信息
cat /proc/version # 查看内核版本
cat /etc/issue # 查看系统版本
lsb_release -a # 查看系统版本 需安装 centos-release
locale -a # 列出全部语系
locale # 当前环境变量中全部编码
hwclock # 查看时间
who # 当前在线用户
w # 当前在线用户
whoami # 查看当前用户名
logname # 查看初始登录用户名
uptime # 查看服务器启动时间
sar -n DEV 1 10 # 查看网卡网速流量
dmesg # 显示开机信息
lsmod # 查看内核模块
查看服务器硬件信息
more /proc/cpuinfo # 查看cpu信息
lscpu # 查看cpu信息
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c # 查看cpu型号和逻辑核心数
getconf LONG_BIT # cpu运行的位数
cat /proc/cpuinfo | grep 'physical id' |sort| uniq -c # 物理cpu个数
cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l # 结果大于0支持64位
cat /proc/cpuinfo|grep flags # 查看cpu是否支持虚拟化 pae支持半虚拟化 IntelVT 支持全虚拟化
more /proc/meminfo # 查看内存信息
dmidecode # 查看全面硬件信息
dmidecode | grep "Product Name" # 查看服务器型号
dmidecode | grep -P -A5 "Memory\s+Device" | grep Size | grep -v Range # 查看内存插槽
cat /proc/mdstat # 查看软raid信息
cat /proc/scsi/scsi # 查看Dell硬raid信息(IBM、HP须要官方检测工具)
lspci # 查看硬件信息
lspci|grep RAID # 查看是否支持raid
lspci -vvv |grep Ethernet # 查看网卡型号
lspci -vvv |grep Kernel|grep driver # 查看驱动模块
modinfo tg2 # 查看驱动版本(驱动模块)
ethtool -i em1 # 查看网卡驱动版本
ethtool em1
使用分析系统分析 Web 日志(如逆火软件)
分析系统性能瓶颈点(IO/Memory/CPU,经常使用工具,top 命令中 shift 组合键的特殊用 Sar/vmstat/iostat/ipcs)
Centos系统中自动获取本机ip的方法
1)Centos7系统 (若是ip所在网卡设备不是eth0,只需更改下面命令中的eth0为具体的网卡设备名称便可)
# ifconfig eth0|sed -n '2p'|sed -e 's/^.*inet//g' -e 's/netmask.*$//g'
# ifconfig eth0|sed -n '2p'|sed 's/^.*inet//g;s/netmask.*$//g'
# ifconfig eth0| sed -nr '2s/(^[^0-9]+)([0-9.]+)+( .*$)/\2/gp'
# ifconfig eth0|sed -n '/broadcast/p'|sed -r 's@inet (.*) netmask.*@\1@'
# ifconfig eth0 |grep netmask|tr -s " "|cut -d" " -f3
例如:
[root@bz4ccs001ap1001 ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1400
inet 172.20.20.93 netmask 255.255.255.0 broadcast 172.20.20.255
inet6 fe80::f816:3eff:fe45:3a6b prefixlen 64 scopeid 0x20<link>
ether fa:16:3e:45:3a:6b txqueuelen 1000 (Ethernet)
RX packets 370851491 bytes 75867300558 (70.6 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 359199243 bytes 90333108242 (84.1 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@bz4ccs001ap1001 ~]# ifconfig eth0|sed -n '2p'
inet 172.20.20.93 netmask 255.255.255.0 broadcast 172.20.20.255
[root@bz4ccs001ap1001 ~]# ifconfig eth0|sed -n '2p'|sed 's/^.*inet//g'
172.20.20.93 netmask 255.255.255.0 broadcast 172.20.20.255
[root@bz4ccs001ap1001 ~]# ifconfig eth0|sed -n '2p'|sed 's/^.*inet//g'|sed 's/netmask.*$//g'
172.20.20.93
[root@bz4ccs001ap1001 ~]# ifconfig eth0|sed -n '2p'|sed -e 's/^.*inet//g' -e 's/netmask.*$//g'
172.20.20.93
注意:
在使用sed命令的时候,若是只是获取信息,最好不要加-i参数,加-i参数后面必需要跟文件名,而且会在文件里生效
不加-i参数,就只是在当前输出里生效
以下,使用-i参数
[root@bz4ccs001ap1001 ~]# ifconfig eth0|sed -n '2p'|sed -i 's/^.*inet//g'
sed: no input files
不使用-i参数
[root@bz4ccs001ap1001 ~]# ifconfig eth0|sed -n '2p'|sed 's/^.*inet//g'
172.20.20.93 netmask 255.255.255.0 broadcast 172.20.20.255
2)Centos6系统
# ifconfig eth0| sed -nr '2s/(^[^0-9]+)([0-9.]+)+( .*$)/\2/gp'
=========================================================================
使用hostname命令也能够获取ip地址
[root@k8s-kevin ~]# hostname -i
172.16.60.241
[root@k8s-kevin ~]# hostname -I #通常用-I参数获取本机ip地址
172.16.60.241 172.30.232.0
查看服务器的外网ip
[root@redis-new01 ~]# curl ifconfig.me
[root@redis-new01 ~]# curl ifconfig.me/all
添加主机名
centos6修改主机名
[root@localhost ~]# hostname kevin-web01
[root@localhost ~]# vim /etc/sysconfig/network
HOSTNAME= kevin-web01
[root@localhost ~]# vim /etc/hosts
127.0.0.1 kevin-web01
还有一种终极修改:
[root@localhost ~]# echo "kernel.hostname = kevin-web01" >> /etc/sysctl.conf
[root@localhost ~]# sysctl -p
=======================================
centos7修改主机名:参考https://www.cnblogs.com/kevingrace/p/8384467.html
修改静态主机名
[root@localhost ~]# hostnamectl --static set-hostname kevin-web01
还能够修改/etc/hostname文件,修改后reboot才会生效。
[root@localhost ~]# cat /etc/hostname
localhost.localdomain
[root@localhost ~]# echo "kevin-web01" > /etc/hostname
[root@localhost ~]# cat /etc/hostname
kevin-web01
强制踢掉登录用户的方法
[root@zabbix-server ~]# who
root tty1 2017-10-24 22:33
root pts/0 2017-10-30 09:30 (172.16.24.193)
root pts/2 2017-10-30 10:19 (172.16.24.193)
chenlin pts/3 2017-10-26 15:13 (172.16.24.6)
只有root用户才能踢人。任何用户均可以踢掉本身。
第一种方法:经过查找出TTY的pid进行kill
[root@zabbix-server ~]# ps -ef|grep pts/3
root 6443 6365 0 10:20 pts/2 00:00:00 grep pts/3
chenlin 26645 26629 0 Oct26 ? 00:00:00 sshd: chenlin@pts/3
chenlin 26646 26645 0 Oct26 pts/3 00:00:00 -bash
[root@zabbix-server ~]# kill -9 26645
[root@zabbix-server ~]# who
root tty1 2017-10-24 22:33
root pts/0 2017-10-30 09:30 (172.16.24.193)
root pts/2 2017-10-30 10:19 (172.16.24.193)
第二种:pkill -kill -t TTY
[root@zabbix-server ~]# pkill -kill -t tty1
[root@zabbix-server ~]# who
root pts/0 2017-10-30 09:30 (172.16.24.193)
root pts/2 2017-10-30 10:19 (172.16.24.193)
[root@zabbix-server ~]# pkill -kill -t pts/0
[root@zabbix-server ~]# who
root pts/2 2017-10-30 10:19 (172.16.24.193)
当一台服务器uptime命令查看负载很高
top命令(按数字1能够查看到每颗CPU的使用状况;大写P降序查看CPU使用率,大写M降序查看内存使用率)
htop命令(和top命令差很少,P、M分别表示降序查看CPU和内存使用率)
iftop命令(流量监控,能够看出哪些机器跟本机有链接)
还能够查看crontab有没有定时任务在消耗资源
iostat命令(iostat 2 5,重点看下%idel剩余使用率)查看IO性能
iotop命令是一个用来监视磁盘I/O使用情况的top类工具,使用iotop命令能够很方便的查看每一个进程是如何使用IO的.
mpstat命令(mpstat 2 5,重点看下%idel剩余使用率)查看CPU性能
设置系统环境变量
1)在终端命令行下设置,这是临时设置。服务器重启后就失效了。好比export PATH=$APTH:/usr/local/mysql/bin
2) 在/etc/profile文件里设置,这是永久性设置。好比
[root@redis-new01 ~]# vim /etc/profile
.....
export PATH=$APTH:/usr/local/mysql/bin
[root@redis-new01 ~]# source /etc/profile
须要注意的是:
在/etc/profile里设置系统环境变量时,路径末尾不能以"/"结尾,不然将致使整个PATH变量出错。
alias设置别名
在当前用户家目录的.bashrc文件中设置,以下设置:
[root@wangshibo ~]# cat /root/.bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias nginx='/opt/zwl/myscripts/nginx.sh'
alias phpd5329='/opt/zwl/myscripts/phpd5329.sh'
alias mysql='/Data/app/mysql5.6.25/bin/mysql'
alias grep='grep --color'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
nmap渗透测试工具使用
查看192.168.10.0/24网段的机器启用状况
[root@redis-new01 ~]# nmap -sn 192.168.10.0/24
=============================================================================
Nmap是一款网络扫描和主机检测的很是有用的工具。 Nmap是不局限于仅仅收集信息和枚举,同时能够用来做为一个漏洞探测器或安全扫描器。
它能够适用于winodws,linux,mac等操做系统。Nmap是一款很是强大的实用工具,可用于:
- 检测活在网络上的主机(主机发现)
- 检测主机上开放的端口(端口发现或枚举)
- 检测到相应的端口(服务发现)的软件和版本
- 检测操做系统,硬件地址,以及软件版本
- 检测脆弱性的漏洞(Nmap的脚本)
- Nmap是一个很是广泛的工具,它有命令行界面和图形用户界面。
Nmap使用不一样的技术来执行扫描,包括:TCP的connect()扫描,TCP反向的ident扫描,FTP反弹扫描等。全部这些扫描的类型有本身的优势和缺点,
Nmap的使用取决于目标主机,由于有一个简单的(基本)扫描和预先扫描之间的差别。咱们须要使用一些先进的技术来绕过防火墙和入侵检测/防护系统,
以得到正确的结果。下面是一些基本的命令和它们的用法的例子:
扫描单一的一个主机,命令以下:
[root@redis-new01 ~]# nmap cnblogs.com
[root@redis-new01 ~]# nmap 192.168.1.2
扫描整个子网,命令以下:
[root@redis-new01 ~]# nmap 172.16.60.207/24
扫描多个目标,命令以下:
[root@redis-new01 ~]# nmap 192.168.1.2 192.168.1.5
扫描一个范围内的目标,以下:
[root@redis-new01 ~]# nmap 172.16.60.207-100 //扫描IP地址为172.16.60.207-172.16.60.20700内的全部主机
若是你有一个ip地址列表,将这个保存为一个txt文件,和namp在同一目录下,扫描这个txt内的全部主机,命令以下:
[root@redis-new01 ~]# nmap -iL target.txt
若是你想看到你扫描的全部主机的列表,用如下命令:
[root@redis-new01 ~]# nmap -sL 172.16.60.207/24
扫描除过某一个ip外的全部子网主机,命令:
[root@redis-new01 ~]# nmap 172.16.60.207/24 -exclude 172.16.60.207
扫描除过某一个文件中的ip外的子网主机命令
[root@redis-new01 ~]# nmap 172.16.60.207/24 -exclude file xxx.txt (xxx.txt中的文件将会从扫描的主机中排除)
扫描特定主机上的80,21,23端口,命令以下
[root@redis-new01 ~]# nmap -p80,21,23 172.16.60.207
Starting Nmap 5.51 ( http://nmap.org ) at 2018-10-27 22:24 CST
Nmap scan report for 172.16.60.207
Host is up (0.00039s latency).
PORT STATE SERVICE
21/tcp open ftp
23/tcp open telnet
80/tcp open http
MAC Address: 00:50:56:88:52:B7 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 0.17 seconds
以上是Nmap的基础知识,下面开始深刻的探讨一下Nmap的扫描技术.
======Tcp SYN Scan (sS)======
这是一个基本的扫描方式,它被称为半开放扫描,由于这种技术使得Nmap不须要经过完整的握手,就能得到远程主机的信息。
Nmap发送SYN包到远程主机,可是它不会产生任何会话.所以不会在目标主机上产生任何日志记录,由于没有造成会话。这个就是SYN扫描的优点.
若是Nmap命令中没有指出扫描类型,默认的就是Tcp SYN.可是它须要root/administrator权限.
[root@redis-new01 ~]# nmap -sS 172.16.60.207
======Tcp connect() scan(sT)======
若是不选择SYN扫描,TCP connect()扫描就是默认的扫描模式.不一样于Tcp SYN扫描,Tcp connect()扫描须要完成三次握手,而且要求调用系统
的connect().Tcp connect()扫描技术只适用于找出TCP和UDP端口.
[root@redis-new01 ~]# nmap -sT 172.16.60.207
======Udp scan(sU)======
顾名思义,这种扫描技术用来寻找目标主机打开的UDP端口.它不须要发送任何的SYN包,由于这种技术是针对UDP端口的。UDP扫描发送UDP
数据包到目标主机,并等待响应,若是返回ICMP不可达的错误消息,说明端口是关闭的,若是获得正确的适当的回应,说明端口是开放的.
[root@redis-new01 ~]# nmap -sU 172.16.60.207
======FIN scan (sF)======
有时候Tcp SYN扫描不是最佳的扫描模式,由于有防火墙的存在.目标主机有时候可能有IDS和IPS系统的存在,防火墙会阻止掉SYN数据包。
发送一个设置了FIN标志的数据包并不须要完成TCP的握手.
root@bt:~[root@redis-new01 ~]# nmap -sF 192.168.1.8
Starting Nmap 5.51 at 2012-07-08 19:21 PKT
Nmap scan report for 192.168.1.8
Host is up (0.000026s latency).
Not shown: 999 closed ports
PORT STATE SERVICE
111/tcp open|filtered rpcbind
FIN扫描也不会在目标主机上建立日志(FIN扫描的优点之一).个类型的扫描都是具备差别性的,FIN扫描发送的包只包含FIN标识,NULL扫描
不发送数据包上的任何字节,XMAS扫描发送FIN、PSH和URG标识的数据包.
======PING Scan (sP)======
PING扫描不一样于其它的扫描方式,由于它只用于找出主机是不是存在在网络中的.它不是用来发现是否开放端口的.PING扫描须要ROOT权限,
若是用户没有ROOT权限,PING扫描将会使用connect()调用.
[root@redis-new01 ~]# nmap -sP 172.16.60.207
======版本检测(sV)======
版本检测是用来扫描目标主机和端口上运行的软件的版本.它不一样于其它的扫描技术,它不是用来扫描目标主机上开放的端口,不过它须要从
开放的端口获取信息来判断软件的版本.使用版本检测扫描以前须要先用TCP SYN扫描开放了哪些端口.
[root@redis-new01 ~]# nmap -sV 172.16.60.207
======Idle scan (sL)======
Idle scan是一种先进的扫描技术,它不是用你真实的主机Ip发送数据包,而是使用另一个目标网络的主机发送数据包.
[root@redis-new01 ~]# nmap -sL 192.168.1.6 172.16.60.207
Idle scan是一种理想的匿名扫描技术,经过目标网络中的192.168.1.6向主机172.16.60.207发送数据,来获取172.16.60.207开放的端口
有须要其它的扫描技术,如 FTP bounce(FTP反弹), fragmentation scan(碎片扫描), IP protocol scan(IP协议扫描),
以上讨论的是几种最主要的扫描方式.
======Nmap的OS检测(O)======
Nmap最重要的特色之一是可以远程检测操做系统和软件,Nmap的OS检测技术在渗透测试中用来了解远程主机的操做系统和软件是很是有用的,
经过获取的信息你能够知道已知的漏洞。Nmap有一个名为的nmap-OS-DB数据库,该数据库包含超过2600操做系统的信息。 Nmap把TCP和UDP数据包发送到目标机器上,而后检查结果和数据库对照。
上面的例子清楚地代表,Nmap的首次发现开放的端口,而后发送数据包发现远程操做系统。操做系统检测参数是O(大写O)
[root@redis-new01 ~][root@redis-new01 ~]# nmap -O 172.16.60.207
Nmap的操做系统指纹识别技术:
- 设备类型(路由器,工做组等)
- 运行(运行的操做系统)
- 操做系统的详细信息(操做系统的名称和版本)
- 网络距离(目标和攻击者之间的距离跳)
若是远程主机有防火墙,IDS和IPS系统,你可使用-PN命令来确保不ping远程主机,由于有时候防火墙会组织掉ping请求.
-PN命令告诉Nmap不用ping远程主机。
[root@redis-new01 ~]# nmap -O -PN 172.16.60.207/24
以上命令告诉发信主机远程主机是存活在网络上的,因此没有必要发送ping请求,使用-PN参数能够绕过PING命令,可是不影响主机的系统的发现。
Nmap的操做系统检测的基础是有开放和关闭的端口,若是OS scan没法检测到至少一个开放或者关闭的端口,会返回如下错误:
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
OS Scan的结果是不可靠的,由于没有发现至少一个开放或者关闭的端口.
这种状况是很是不理想的,应该是远程主机作了针对操做系统检测的防范。若是Nmap不能检测到远程操做系统类型,那么就没有必要使用-osscan_limit检测。
想好经过Nmap准确的检测到远程操做系统是比较困难的,须要使用到Nmap的猜想功能选项, –osscan-guess 猜想认为最接近目标的匹配操做系统类型。
[root@redis-new01 ~]# nmap -O –osscan-guess 172.16.60.207
关机 (系统的关机、重启以及登出 )
shutdown -h now 关闭系统
init 0 关闭系统
init 6 重启系统
telinit 0 关闭系统
shutdown -h hours:minutes & 按预约时间关闭系统
shutdown -c 取消按预约时间关闭系统
shutdown -r now 重启
poweroff 关机
reboot 重启
logout 注销
使用”whois”命令能够查询到域名的注册信息
1)好比查询www.kevin.com、www.qq.com域名注册信息(使用whois命令查询时,须要去掉域名前面的www)
[root@bastion ~]# whois kevin.com
[root@bastion ~]# whois qq.com
2)查询ip注册信息
[root@bastion ~]# whois 112.110.116.15
操作使用技巧
vim使用技巧
删除不包含任何空格的空行:g/^$/d
删除包含空格的空行:g/^\s*$/d
删除行首空格:%s/^\s*//g
删除行尾空格:%s/\s*$//g
在全部"--"处进行分行:%s/--/\r/g
删除只有空格的行: %s/^\s\+$//
删除连续两个或两个以上空行,只留一个: %s/\n\{3,\}/\r\r/
清空一行的内容而不删除一行: 0D (或者0d$)
复制第6行到第9行之间的内容到第12行后面: 6,9 co 12
删除每行第一个字符: %s/^.//g
删除当前光标下的字符: x
删除光标以后的单词剩余部分: dw
删除光标以后的该行剩余部分: d$ (删除光标以前的该行剩余部分: d^)
删除当前行: dd
c功能和d相同,区别在于完成删除操做后进入INSERT MODE(即进入编辑模式),好比cw删除贯标以后的单词剩余部分后进入编辑模式
==================vim快捷键==================
gg 光标跳到第一行
nG 光标跳到第n行。也能够在尾行模式下输入:n 回车便可
G 光标跳到最后一行
o 光标跳到当前所在行的下一行
O 光标跳到当前所在行的上一行
yyp 复制当前所在行的内容到下一行
yyP 复制当前所在行的内容到上一行
dd 删除当前所在行
ndd 删除当前如下n行
shift+v 选中行区域
ctrl+v 选中列区域
命令行模式下按键^ 跳到行首,至关于home键
命令行模式下按键$ 跳到行尾,至关于end键
命令行模式下按键u 撤销
命令行模式下按键r 恢复
尾行模式下输入:%s/m/n/g 替换文件中全部行中的m字符为n字符
尾行模式下输入:s/m/n/g 替换光标所在行的m字符为n字符
日志管理经常使用命令
history # 历时命令默认1000条
HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S " # 让history命令显示具体时间
history -c # 清除记录命令
cat $HOME/.bash_history # 历史命令记录文件
lastb -a # 列出登陆系统失败的用户相关信息
echo > /var/log/btmp # 清空二进制日志记录文件
last # 查看登录过的用户信息
echo > /var/log/wtmp # 清空二进制日志记录文件
who /var/log/wtmp # 查看登录过的用户信息
lastlog # 用户最后登陆的时间
tail -f /var/log/messages # 系统日志 php
tail -f /var/log/secure # ssh日志
常用正则表达式
匹配中文字符的正则表达式:[\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]
评注:能够用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式:\n\s*\r
评注:能够用来删除空白行
匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*?/>
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:^\s*|\s*$
评注:能够用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),很是有用的表达式
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
评注:网上流传的版本功能颇有限,上面这个基本能够知足需求
匹配账号是否合法(字母开头,容许5-16字节,容许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}
评注:匹配形式如 0511-4405222或 021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
匹配中国邮政编码:[1-9]\d{5}(?!\d)
评注:中国邮政编码为6位数字
匹配身份证:\d{15}|\d{18}
评注:中国的身份证为15位或18位
匹配ip地址:\d+\.\d+\.\d+\.\d+
评注:提取ip地址时有用
匹配特定数字:
^[1-9]\d*$ //匹配正整数
^-[1-9]\d*$ //匹配负整数
^-?[1-9]\d*$ //匹配整数
^[1-9]\d*|0$ //匹配非负整数(正整数 +0)
^-[1-9]\d*|0$ //匹配非正整数(负整数 +0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ //匹配正浮点数
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ //匹配负浮点数
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$ //匹配浮点数
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ //匹配非负浮点数(正浮点数+ 0)
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$ //匹配非正浮点数(负浮点数+ 0)
评注:处理大量数据时有用,具体应用时注意修正
匹配特定字符串:
^[A-Za-z]+$ //匹配由26个英文字母组成的字符串
^[A-Z]+$ //匹配由26个英文字母的大写组成的字符串
^[a-z]+$ //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串
^\w+$ //匹配由数字、26个英文字母或者下划线组成的字符串
评注:最基本也是最经常使用的一些表达式
终端命令行限制设置- stty命令
好比在远程一台机器的终端里粘贴一条长命令,发现粘贴后,命令的前一部分就自动缩进消失了!
这是由于这台机器的终端命令行作了columns列限制,即长度多了限制。
stty命令说明: http://man.linuxde.net/stty
例子:
[root@docker-registry ~]# stty -a
speed 38400 baud; rows 40; columns 187; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O;
min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
[root@docker-registry ~]# stty size #查看命令行的行和列数限制
40 187
[root@docker-registry ~]# stty columns 500 #设置命令行的列数。上面的问题就是columns列数限制引发的,将其设置大点就能够了
[root@docker-registry ~]# stty rows 200 #设置命令行的行数
[root@docker-registry ~]# stty size
200 500
[root@docker-registry ~]# stty -a
speed 38400 baud; rows 200; columns 500; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
Linux终端窗口命令行里的快捷键
CTRL + A 移动光标到行首
CTRL + E 移动光标到行末
CTRL + U 剪切光标前的内容
CTRL + K 剪切光标至行末的内容
CTRL + Y 粘贴
CTRL + S 锁住当前终端
CTRL + Q 解锁
CRTL + T 将光标所在当前字符移到前一个字符的前面
CRTL + W 删除光标前面的内容
Shift + Insert 向终端内粘贴文本
ESC + . 显示上一条命令的最后一部分
Linux运维常用技巧
1)使用pgrep快速查找一个PID
pgrep遍历目前正在运行的进程而后列出符合查找规则的进程ID(PID)。
[root@redis-new01 ~]# pgrep ssh
这条命令会列出全部与ssh有关的进程。
2)执行上次执行过的命令
这个标题有些绕口,可是它是名副其实的。
[root@redis-new01 ~]# !!
这会执行你上一次在命令行中执行过的命令。
3)执行最近一次以xx开头的命令(lxx)
若是你想要从命令行历史中执行一个iptables开头的命令时,你可使用以下命令:
[root@redis-new01 ~]# !ipta
它会执行最近一次在命令行中执行且以字母ipta开头的命令。
4)反复执行一个命令并在屏幕上输出
watch会反复运行一个命令,并在屏幕上打印输出。它可让你实时的观察程序的输出变化。默认状况下,程序每2秒运行一次。watch命令与tail命令很类似。
[root@redis-new01 ~]# watch -d ls -l
这条命令会监视当前目录的全部文件,而且高亮文件所发生的改变。
5)在VI/VIM中快速保存
若是你很匆忙,你能够经过"shift + zz"快速地从vim的插入模式中退出。
6)可使用以下命令返回你上一次所在的目录:
[root@redis-new01 ~]# cd -
7)设置文件的时间戳。日期格式是(YYMMDDhhmm)
好比下面这条命令能够把aaa文件的时间戳设置成2017-01-01 12:00
[root@test3-237 ~][root@redis-new01 ~]# touch -c -t 1801011200 aaa
[root@test3-237 ~][root@redis-new01 ~]# ll aaa
-rw-r--r--. 1 root root 9 Jan 1 2018 aaa
[root@test3-237 ~][root@redis-new01 ~]# stat aaa
File: 'aaa'
Size: 9 Blocks: 8 IO Block: 4096 regular file
Device: fc02h/64514d Inode: 265217 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2018-01-01 12:00:00.000000000 +0800
Modify: 2018-01-01 12:00:00.000000000 +0800
Change: 2017-04-24 16:35:53.028995737 +0800
8)访问上一个命令中的最后一个参数,使用Esc + .
[root@test3-237 ~][root@redis-new01 ~]# ls /usr/local/mysql/
好比执行了上面的命令,如今想切换到/usr/local/mysql目录下,作法是:
先输入cd,而后在后面依次按键Esc 加上 .号就会自动补出/usr/local/mysql(即上一个命令中的最后一个参数)
暂停或挂起前台的命令,并在后台运行它(至关于nohup …. &)
当在linux终端里运行一个要执行很长时间的命令,为了让其在后台运行(释放当前终端),步骤以下:
CTRL + Z 将这个命令在前台挂起,会显示一个序列号,好比1
bg 1 即bg 序列号
disown -a 将其放到后台运行。这样即便退出ssh登录后,命令仍会在目标机器上运行
echo命令中使用-e选项启用’\’转义,将’\n’解析成换行
[root@bastion-IDC ~]# echo -e "q11\n3452345\nHASHHDF\n数据库\nuuu\n4444" >a.txt
[root@bastion-IDC ~]# cat a.txt
q11
3452345
HASHHDF
数据库
uuu
4444
date命令总结
date命令是显示或设置系统时间与日期。 不少shell脚本里面须要打印不一样格式的时间或日期,以及要根据时间和日期执行操做。
延时一般用于脚本执行过程当中提供一段等待的时间。日期能够以多种格式去打印,也可使用命令设置固定的格式。在类UNIX系统中,
日期被存储为一个整数,其大小为自世界标准时间(UTC)1970年1月1日0时0分0秒起流逝的秒数。
选项:
-d<字符串>:显示字符串所指的日期与时间。字符串先后必须加上双引号;
-s<字符串>:根据字符串来设置日期与时间。字符串先后必须加上双引号;
-u:显示GMT;
--help:在线帮助;
--version:显示版本信息。
参数:
<+时间日期格式>:指定显示时使用的日期时间格式。
日期格式字符串列表:
%a 当前locale 的星期名缩写(例如: 日,表明星期日),星期的简称(Sun~Sat)
%A 当前locale 的星期名全称 (如:星期日),星期的全称(Sunday~Saturday)
%b 当前locale 的月名缩写 (如:一,表明一月)
%B 当前locale 的月名全称 (如:一月),月的全称(January~December)
%c 当前locale 的日期和时间 (如:2005年3月3日 星期四 23:05:25),日期和时间(Tue Nov 20 14:12:58 2012)
%C 世纪;好比 %Y,一般为省略当前年份的后两位数字(例如:20)
%d 按月计的日期(例如:01),一个月的第几天(01~31)
%D 按月计的日期;等于%m/%d/%y;日期(mm/dd/yy) ,至关于%x
%e 按月计的日期,添加空格,等于%_d
%F 完整日期格式,等价于 %Y-%m-%d
%g ISO-8601 格式年份的最后两位 (参见%G)
%G ISO-8601 格式年份 (参见%V),通常只和 %V 结合使用
%h 等于%b,月的简称(Jan~Dec)
%H 小时,24小时制(00~23)
%I 小时,12小时制(01~12)
%c 按年计的日期(001-366)
%k 小时,24小时制(0~23)
%l 小时,12小时制(1~12)
%m 月份(01~12)
%M 分钟(00~59)
%j 一年的第几天(001~366)
%n 换行
%N 纳秒(000000000-999999999)
%p 显示出AM或PM,即显示当前locale下的"上午"或者"下午",未知时输出为空
%P 与%p 相似,可是输出小写字母
%r 当前locale下的12 小时时钟时间 (hh:mm:ss %p)(如:11:11:04 下午)
%R 24 小时时间的时和分,等价于 %H:%M
%s 自UTC 时间 1970-01-01 00:00:00 以来所通过的秒数,即从1970年1月1日00:00:00到目前经历的秒数
%S 显示秒(00~59)
%t 输出制表符 Tab
%T 显示时间,24小时制(hh:mm:ss),等于%H:%M:%S
%u 星期,1 表明星期一
%U 一年中的第几周,以周日为每星期第一天(00-53)
%V ISO-8601 格式规范下的一年中第几周,以周一为每星期第一天(01-53)
%w 一星期中的第几日(0-6),0 表明周一,一个星期的第几天(0表明星期天)
%W 一年中的第几周,以周一为每星期第一天(00-53),一年的第几个星期(00~53,星期一为第一天)
%x 当前locale 下的日期描述 (如:12/31/99)
%X 显示时间的格式(%H:%M:%S),当前locale 下的时间描述 (如:23:13:48)
%Z 显示时区,日期域(CST)
%y 年份最后两位数位 (00-99),(2016则是16)
%Y 年份
%z +hhmm 数字时区(例如,-0400)
%:z +hh:mm 数字时区(例如,-04:00)
%::z +hh:mm:ss 数字时区(例如,-04:00:00)
%:::z 数字时区带有必要的精度 (例如,-04,+05:30)
%Z 按字母表排序的时区缩写 (例如,EDT)
默认状况下,日期的数字区域以0 填充。
如下可选标记能够跟在"%"后:
- (连字符)不填充该域
_ (下划线)以空格填充
0 (数字0)以0 填充
^ 若是可能,使用大写字母
# 若是可能,使用相反的大小写
在任何标记以后还容许一个可选的域宽度指定,它是一个十进制数字。
做为一个可选的修饰声明,它能够是E,在可能的状况下使用本地环境关联的
表示方式;或者是O,在可能的状况下使用本地环境关联的数字符号。
时间输出
date是Linux系统里自带的一个系统命令,用来显示当前的系统时间,不过默认显示的结果里包括不少信息,特别是作为文件名输出时,
不是很方便
好在date命令里包含格式化输出的选项
实例操做说明:
加减操做:
date +%Y%m%d //显示前天年月日
date -d "+1 day" +%Y%m%d //显示前一天的日期
date -d "-1 day" +%Y%m%d //显示后一天的日期
date -d "-1 month" +%Y%m%d //显示上一月的日期
date -d "+1 month" +%Y%m%d //显示下一月的日期
date -d "-1 year" +%Y%m%d //显示前一年的日期
date -d "+1 year" +%Y%m%d //显示下一年的日期
设定时间:
date -s //设置当前时间,只有root权限才能设置,其余只能查看
date -s 20120523 //设置成20120523,这样会把具体时间设置成空00:00:00
date -s 01:01:01 //设置具体时间,不会对日期作更改
date -s "01:01:01 2012-05-23" //这样能够设置所有时间
date -s "01:01:01 20120523" //这样能够设置所有时间
date -s "2012-05-23 01:01:01" //这样能够设置所有时间
date -s "20120523 01:01:01" //这样能够设置所有时间
有时须要检查一组命令花费的时间,好比检查“ntpdate us.pool.ntp.org”和“yum list”等命令执行所花费的时间:
[root@bastion-IDC ~]# cat time.sh
#!/bin/bash
start=$(date +%s)
ntpdate us.pool.ntp.org &> /dev/null
yum list > /dev/null 2>&1
end=$(date +%s)
difference=$(( end - start ))
echo $difference seconds
[root@bastion-IDC ~]# sh time.sh
7 seconds
输出当前日期:
[root@bastion-IDC ~]# date +"%Y-%m-%d"
2009-12-07
输出昨天日期:
[root@bastion-IDC ~]# date -d "1 day ago" +"%Y-%m-%d"
2012-11-19
2秒后输出:
[root@bastion-IDC ~]# date -d "2 second" +"%Y-%m-%d %H:%M.%S"
2012-11-20 14:21.31
传说中的 1234567890 秒:
[root@bastion-IDC ~]# date -d "1970-01-01 1234567890 seconds" +"%Y-%m-%d %H:%m:%S"
2009-02-13 23:02:30
普通转格式:
[root@bastion-IDC ~]# date -d "2009-12-12" +"%Y/%m/%d %H:%M.%S"
2009/12/12 00:00.00
apache格式转换:
[root@bastion-IDC ~]# date -d "Dec 5, 2009 12:00:37 AM" +"%Y-%m-%d %H:%M.%S"
2009-12-05 00:00.37
格式转换后时间游走:
[root@bastion-IDC ~]# date -d "Dec 5, 2009 12:00:37 AM 2 year ago" +"%Y-%m-%d %H:%M:%S"
2007-12-05 00:00:37
[root@bastion-IDC ~]# date "+%Y-%m-%d"
2013-02-19
[root@bastion-IDC ~]# date "+%H:%M:%S"
13:13:59
[root@bastion-IDC ~]# date "+%Y-%m-%d %H:%M:%S"
2013-02-19 13:14:19
[root@bastion-IDC ~]# date "+%Y_%m_%d %H:%M:%S"
2013_02_19 13:14:58
[root@bastion-IDC ~]# date -d today
Tue Feb 19 13:10:38 CST 2013
[root@bastion-IDC ~]# date -d now
Tue Feb 19 13:10:43 CST 2013
[root@bastion-IDC ~]# date -d tomorrow
Wed Feb 20 13:11:06 CST 2013
[root@bastion-IDC ~]# date -d yesterday
Mon Feb 18 13:11:58 CST 2013
[root@bastion-IDC ~]# date
Thu Nov 24 15:55:21 CST 2016
[root@bastion-IDC ~]# date +%A
Thursday
[root@bastion-IDC ~]# date +%a
Thu
[root@bastion-IDC ~]# date +%b
Nov
[root@bastion-IDC ~]# date +%B
November
[root@bastion-IDC ~]# date +%y
16
[root@bastion-IDC ~]# date +%w
4
[root@bastion-IDC ~]# date +%W
47
[root@bastion-IDC ~]# date +%j
329
tomcat中的war包直接解压方法
tomcat里面的war包可使用unzip解压
先关闭tomcat服务,而后建立webapps,将war包放到webapps下解包,而后再将war包删除,最后启动tomcat
git提交文件
在修改文件后,执行下面操做进行代码提交到git:
git add .
git status #查看修改了哪些文件信息
git commit -m "edit message"
git push
“syntax error: unexpected end of file”
通常从windows下的shell脚本传到Linux上可能会出现这样的问题,是由于Windows和Linux下的行末结束符是不同的。即windoes下的dos格式文件传输到unix系统时,会在每行的结尾多一个^M,也就是说dos文件中的换行符”\r\n”会被转换为unix文件中的换行符”\n”,而此文件如果一个可执行文件的话,会致使此文件不能被执行。
=======================================================================================================================
案例一:
好比:我有一个test.sh脚本须要上传到centos系统中执行,可是传输到centos系统中,没法正常执行(前提脚本是彻底能够执行的,没有错误)。可能缘由是在windos系统上使用了相似notepad++的工具修改了可执行文件内容,致使在centos系统下没法正常执行。
案例二:
在本机(win10)测试正常的程序到了线上linux环境下就是跑步起来,tomcat老是卡在loading config.properties这里,换了一个tomcat也是这种状况,之前是没有问题的。最后怀疑是config.properties文件的问题,而后经过vim查看config.properties文件的fileformat格式,命令":set fileformat",结果显示的是dos, 最后经过命令修改成":set fileformat=unix"
=======================================================================================================================
这样先弄清楚一下"回车"和"换行符"的区别:
1)回车"\r"
本义是光标从新回到本行开头,r的英文return,控制字符能够写成CR,即Carriage Return
2)换行"\n"
本义是光标往下一行(不必定到下一行行首),n的英文newline,控制字符能够写成LF,即Line Feed
解决办法:
1)使用vim打开file.sh脚本文件,进入编辑模式,修改以下:
:set ff=unix (或者:set fileformat=unix)
:wq
2)若是以上步骤要求在一个shell批处理文件中完成,那么该怎么办?能够这样:
vi +':w ++ff=unix' +':q' ${file}
这样一条命令就能够搞定了,可是要严格注意上面空格的位置,不能多不能少。
================================================================================
总结:在windows下新建的sh文件,copy到linux下有的会报错,通常是格式问题。
解决办法:使用vim编辑器进行一下文件格式fileformat转换可以使用fileformat或简写ff。
在vim编辑可执行文件:
set ff 或 set ff? #显示当前文件格式
set fileformat=unix 或 set ff=unix #设置成unix格式
set ff=dos #设置成dos格式
dos格式文件传输到unix系统时,会在每行的结尾多一个^M(/r)
删除^M的方法:
:%s//r//g
%s/\r//g
文件系统、打包压缩、软件包操作
打包和压缩文件
bunzip2 file1.bz2 解压一个叫作 'file1.bz2'的文件
bzip2 file1 压缩一个叫作 'file1' 的文件
gunzip file1.gz 解压一个叫作 'file1.gz'的文件
gzip file1 压缩一个叫作 'file1'的文件
gzip -9 file1 最大程度压缩
rar a file1.rar test_file 建立一个叫作 'file1.rar' 的包
rar a file1.rar file1 file2 dir1 同时压缩 'file1', 'file2' 以及目录 'dir1'
rar x file1.rar 解压rar包
unrar x file1.rar 解压rar包
tar -cvf archive.tar file1 建立一个非压缩的 tarball
tar -cvf archive.tar file1 file2 dir1 建立一个包含了 'file1', 'file2' 以及 'dir1'的档案文件
tar -tf archive.tar 显示一个包中的内容
tar -xvf archive.tar 释放一个包
tar -xvf archive.tar -C /tmp 将压缩包释放到 /tmp目录下
tar -cvfj archive.tar.bz2 dir1 建立一个bzip2格式的压缩包
tar -xvfj archive.tar.bz2 解压一个bzip2格式的压缩包
tar -cvfz archive.tar.gz dir1 建立一个gzip格式的压缩包
tar -xvfz archive.tar.gz 解压一个gzip格式的压缩包
zip file1.zip file1 建立一个zip格式的压缩包
zip -r file1.zip file1 file2 dir1 将几个文件和目录同时压缩成一个zip格式的压缩包
unzip file1.zip 解压一个zip格式压缩包
rar包解压
[root@redis-new01 ~]# mkdir -p /home/tools
[root@redis-new01 ~]# cd /home/tools
[root@redis-new01 ~]# wget http://www.rarlab.com/rar/rarlinux-3.8.0.tar.gz
[root@redis-new01 ~]# tar zxvf rarlinux-3.8.0.tar.gz
[root@redis-new01 ~]# cd rar
[root@redis-new01 rar]# make
[root@redis-new01 rar]# make install
将/opt/www目录压缩为www.rar命令为:
[root@redis-new01 ~]# rar a www.rar /opt/www
将www.rar解压命令(下面两种方式)
1)rar x www.rar //解压成www目录
2)unrar -e www.tar //解压出来的是www目录下的文件,而不是直接的www目录
=========================
1)报错
bash: /usr/local/bin/rar: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
解决办法:
[root@redis-new01 ~]# yum install glibc.i686
2)报错
error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
解决办法:
[root@redis-new01 ~]# yum install libstdc++.so.6
tar命令:打包
解压
语法:tar [主选项+辅选项] 文件或者目录
使用该命令时,主选项是必需要有的,它告诉tar要作什么事情,辅选项是辅助使用的,能够选用。
主选项:
c 建立新的档案文件。若是用户想备份一个目录或是一些文件,就要选择这个选项。至关于打包。
x 从档案文件中释放文件。至关于拆包。
t 列出档案文件的内容,查看已经备份了哪些文件。
特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在!由于不可能同时压缩与解压缩。
辅助选项:
-z :是否同时具备 gzip 的属性?亦便是否须要用 gzip 压缩或解压? 通常格式为xx.tar.gz或xx. tgz
-j :是否同时具备 bzip2 的属性?亦便是否须要用 bzip2 压缩或解压?通常格式为xx.tar.bz2
-v :压缩的过程当中显示文件!这个经常使用
-f :使用档名,请留意,在 f 以后要当即接档名喔!不要再加其余参数!
-p :使用原文件的原来属性(属性不会依据使用者而变)
--exclude FILE:在压缩的过程当中,不要将 FILE 打包!
--remove-files:打包后将源文件删除
经常使用的结构:
tar
tar.gz
tar.bz2
好比将文件file1打包上上面三种格式,分别是:
tar -vcf file.tar file #将文件file打包成tar格式,打包参数-c
tar -vxf file.tar -C /mnt #将file.tar包解压到目标目录/mnt上,解包参数-x,-C是解压到哪一个目标目录下
tar -zvcf file.tar.gz file
tar -zvxf file.tar.gz -C /mnt
tar -jvcf file.tar.bz2 file
tar -jvxf file.tar.bz2 -C /mnt
示例一:
[root@localhost ~]# ll /mnt/kevin.txt
-rw-r--r--. 1 root root 0 Jun 8 03:03 /mnt/kevin.txt
[root@localhost ~]# tar -zvcf /opt/kevin-`date +%Y%m%d`.tar.gz /mnt/kevin.txt --remove-files
tar: Removing leading '/' from member names
/mnt/kevin.txt
[root@localhost ~]# ll /opt/
-rw-r--r--. 1 root root 118 Jun 8 03:03 kevin-20180608.tar.gz
[root@localhost ~]# ll /mnt/kevin.txt
ls: cannot access /mnt/kevin.txt: No such file or directory
示例二:将整个 /etc 目录下的文件所有打包成为 /tmp/etc.tar
[root@linux ~]# tar -cvf /tmp/etc.tar /etc <==仅打包,不压缩!
[root@linux ~]# tar -zcvf /tmp/etc.tar.gz /etc <==打包后,以 gzip 压缩
[root@linux ~]# tar -jcvf /tmp/etc.tar.bz2 /etc <==打包后,以 bzip2 压缩
特别注意:
在参数 f 以后的文件档名是本身取的,咱们习惯上都用 .tar 来做为辨识。
若是加 z 参数,则以 .tar.gz 或 .tgz 来表明 gzip 压缩过的 tar file ~
若是加 j 参数,则以 .tar.bz2 来做为附档名啊~
上述指令在执行的时候,会显示一个警告讯息:
tar: Removing leading `/" from member names 这是关于绝对路径的特殊设定。
示例三:查阅上述 /tmp/etc.tar.gz 文件内有哪些文件?
[root@linux ~]# tar -ztvf /tmp/etc.tar.gz
由於咱们使用 gzip 压缩,因此要查阅该 tar file 内的文件时,
就得要加上 z 这个参数了!这很重要的!
示例四:将 /tmp/etc.tar.gz 文件解压缩在 /usr/local/src 底下
[root@linux ~]# cd /usr/local/src
[root@linux src]# tar -zxvf /tmp/etc.tar.gz
在预设的状况下,咱们能够将压缩档在任何地方解开的!以这个示例来讲
我先将工做目录变换到 /usr/local/src 底下,而且解开 /tmp/etc.tar.gz
则解开的目录会在 /usr/local/src/etc ,另外,若是您进入 /usr/local/src/etc
则会发现,该目录下的文件属性与 /etc/ 可能会有所不一样喔!
示例五:在 /tmp 底下,我只想要将 /tmp/etc.tar.gz 内的 etc/passwd 解开而已
[root@linux ~]# cd /tmp
[root@linux tmp]# tar -zxvf /tmp/etc.tar.gz etc/passwd
我能够透过 tar -ztvf 来查阅 tarfile 内的文件名称,若是单只要一个文件,
就能够透过这个方式来下达!注意到! etc.tar.gz 内的根目录 / 是被拿掉了!
示例六:我要备份 /home, /etc ,但不要 /home/dmtsai
[root@linux ~]# tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc
另外:tar命令的C参数
[root@linux ~]# tar -cvf file2.tar /home/usr2/file2
tar: Removing leading '/' from members names
home/usr2/file2
该命令能够将/home/usr2/file2文件打包到当前目录下的file2.tar中,
须要注意的是:使用绝对路径标识的源文件,在用tar命令压缩后,文件名连同绝对路径(这里是home/usr2/,根目录'/'被自动去掉了)一并被压缩进来。使用tar命令解压缩后会出现如下状况:
[root@linux ~]# tar -xvf file2.tar
[root@linux ~]# ls
…… …… home …… ……
解压缩后的文件名不是想象中的file2,而是home/usr2/file2。
[root@linux ~]# tar -cvf file2.tar -C /home/usr2 file2
该命令中的-C dir参数,将tar的工做目录从当前目录改成/home/usr2,将file2文件(不带绝对路径)压缩到file2.tar中。
注意:-C dir参数的做用在于改变工做目录,其有效期为该命令中下一次-C dir参数以前。
使用tar的-C dir参数,一样能够作到在当前目录/home/usr1下将文件解压缩到其余目录,
例如:
[root@linux ~]# tar -xvf file2.tar -C /home/usr2
而tar不用-C dir参数时是没法作到的:
[root@linux ~]# tar -xvf file2.tar /home/usr2
tar: /tmp/file: Not found in archive
tar: Error exit delayed from previous errors
unrar命令:解压RAR文件
1、经常使用用法
unrar x "rar文件名"
2、含义与选项
2.一、含义
解压rar文件到当前目录,并保存原压缩文件目录结构。
2.二、选项
“x”:解压时保存原压缩文件目录结构
示例:
查看rar包中的内容:
[root@redis-new01 ~]# unrar l *.rar
或者
[root@redis-new01 ~]# unrar v *.rar
测试rar包是否能解压成功:
[root@redis-new01 ~]# unrar t *.rar
解压到当前文件夹:
[root@redis-new01 ~]# unrar e *.rar
解压到指定文件夹:
[root@redis-new01 ~]# unrar x *.rar /tmp
===========================================================
zip命令用来压缩文件。gzip是个使用普遍的压缩程序,文件经它压缩事后,其名称后面会多处“.gz”扩展名。
1)用法:
gzip [选项参数][-s <压缩字尾字符串>] [文件...]
或 gzip [选项参数][-s <压缩字尾字符串>] [目录]
2)功能:
gzip是个使用普遍的解压缩程序,它用于解开被gzip压缩过的文件,这些压缩文件预设最后的扩展名为".gz"。
事实上gzip就是gzip的硬链接,所以不管是压缩或解压缩,均可经过gzip指令单独完成。
3)选项参数:
-d --decompress --uncompress 解开压缩文件;
-v --verbose 显示指令执行过程;
-l --list 列出压缩文件的相关信息;
-r --recursive 递归处理,将指定目录下的全部文件及子目录一并处理;
-A --catenate: 新增文件到已存在的备份文件;
-B 设置区块大小
-c 把解压后的文件输出到标准输出设备
示例一
[root@redis-new01 ~]# gzip *
[root@redis-new01 ~]# ll
总用量 12
-r-xr-xr-x. 1 sunjimeng root 411 5月 9 07:59 head_text.gz
-r-xr-xr-x. 1 root sunjimeng 67 5月 9 08:15 less1.gz
-r-xr-xr-x. 1 root sunjimeng 80 5月 9 08:16 less2.gz
示例二
[root@redis-new01 ~]# gzip -d * //解压当前目录的全部文件
[root@redis-new01 ~]# gzip * //解压并不能像压缩时那样什么参数都不带,须要带解压命令-d
gzip: head_text.gz already has .gz suffix -- unchanged
gzip: less1.gz already has .gz suffix -- unchanged
gzip: less2.gz already has .gz suffix -- unchanged
[root@redis-new01 ~]# gzip -d *
[root@redis-new01 ~]# ll
总用量 12
-r-xr-xr-x. 1 sunjimeng root 664 5月 9 07:59 head_text
-r-xr-xr-x. 1 root sunjimeng 45 5月 9 08:15 less1
-r-xr-xr-x. 1 root sunjimeng 57 5月 9 08:16 less2
示例三
[root@redis-new01 ~]# gzip -v *
head_text: 42.3% -- replaced with head_text.gz
less1: 4.4% -- replaced with less1.gz
less2: 1.8% -- replaced with less2.gz
[root@redis-new01 ~]# gzip -dv *
head_text.gz: 42.3% -- replaced with head_text
less1.gz: 4.4% -- replaced with less1
less2.gz: 1.8% -- replaced with less2
示例四
[root@redis-new01 ~]# gzip -l *
[root@redis-new01 ~]# gzip -l *
compressed uncompressed ratio uncompressed_name
411 664 42.3% head_text
67 45 4.4% less1
80 57 1.8% less2
558 766 30.3% (totals)
[root@redis-new01 ~]# ll
总用量 12
-r-xr-xr-x. 1 sunjimeng root 411 5月 9 07:59 head_text.gz
-r-xr-xr-x. 1 root sunjimeng 67 5月 9 08:15 less1.gz
-r-xr-xr-x. 1 root sunjimeng 80 5月 9 08:16 less2.gz
示例五
[root@redis-new01 ~]# tar -cvf Dir.tar Dir
Dir/
Dir/head_text.gz
Dir/less1.gz
Dir/less2.gz
[root@redis-new01 ~]# ll
总用量 12
dr-xr-xr-x. 2 root sunjimeng 55 5月 24 07:28 Dir
-rw-r--r--. 1 root root 10240 5月 24 07:34 Dir.tar
[root@redis-new01 ~]# gzip -v Dir.tar
Dir.tar: 92.1% -- replaced with Dir.tar.gz
[root@redis-new01 ~]# gzip -l Dir.tar.gz
compressed uncompressed ratio uncompressed_name
833 10240 92.1% Dir.tar
示例六
[root@redis-new01 ~]# tar cvf Dir1.tar -R Dir
块 0:Dir/
块 1:Dir/head_text.gz
块 3:Dir/less1.gz
块 5:Dir/less2.gz
[root@redis-new01 ~]# tar -cvf Dir2.tar Dir
Dir/
Dir/head_text.gz
Dir/less1.gz
Dir/less2.gz
[root@redis-new01 ~]# tar -cvf Dir3.tar -R Dir
块 0:Dir/
块 1:Dir/head_text.gz
块 3:Dir/less1.gz
块 5:Dir/less2.gz
示例七
[root@redis-new01 ~]# gzip -vr findDir //递归的压缩子文件夹下的文件
gzip: findDir/Dir/head_text.gz already has .gz suffix -- unchanged
gzip: findDir/Dir/less1.gz already has .gz suffix -- unchanged
gzip: findDir/Dir/less2.gz already has .gz suffix -- unchanged
gzip: findDir/Dir.tar.gz already has .gz suffix -- unchanged
findDir/Dir1.tar: 92.1% -- replaced with findDir/Dir1.tar.gz
findDir/Dir2.tar: 92.1% -- replaced with findDir/Dir2.tar.gz
findDir/Dir3.tar: 92.1% -- replaced with findDir/Dir3.tar.gz
[root@redis-new01 ~]# ls -l findDir
总用量 16
-rw-r--r--. 1 root root 833 5月 24 07:34 Dir.tar.gz
-rw-r--r--. 1 root root 834 5月 24 07:43 Dir3.tar.gz
-rw-r--r--. 1 root root 834 5月 24 07:39 Dir2.tar.gz
-rw-r--r--. 1 root root 834 5月 24 07:39 Dir1.tar.gz
dr-xr-xr-x. 2 root sunjimeng 55 5月 24 07:28 Dir
[root@redis-new01 ~]# ls -l findDir/Dir
总用量 12
-r-xr-xr-x. 1 root sunjimeng 80 5月 9 08:16 less2.gz
-r-xr-xr-x. 1 root sunjimeng 67 5月 9 08:15 less1.gz
-r-xr-xr-x. 1 sunjimeng root 411 5月 9 07:59 head_text.gz
示例八
[root@redis-new01 ~]# gzip -rdv Dir //递归的解压目录下的全部.gz的文件
[root@redis-new01 ~]# ls -l Dir
总用量 12
-r-xr-xr-x. 1 sunjimeng root 411 5月 9 07:59 head_text.gz
-r-xr-xr-x. 1 root sunjimeng 67 5月 9 08:15 less1.gz
-r-xr-xr-x. 1 root sunjimeng 80 5月 9 08:16 less2.gz
[root@redis-new01 ~]# gzip -rdv Dir
Dir/head_text.gz: 42.3% -- replaced with Dir/head_text
Dir/less1.gz: 4.4% -- replaced with Dir/less1
Dir/less2.gz: 1.8% -- replaced with Dir/less2
[root@redis-new01 ~]# ls -l Dir
总用量 12
-r-xr-xr-x. 1 sunjimeng root 664 5月 9 07:59 head_text
-r-xr-xr-x. 1 root sunjimeng 45 5月 9 08:15 less1
-r-xr-xr-x. 1 root sunjimeng 57 5月 9 08:16 less2
[root@redis-new01 ~]# gzip -r Dir
[root@redis-new01 ~]# ls -l Dir
总用量 12
-r-xr-xr-x. 1 sunjimeng root 411 5月 9 07:59 head_text.gz
-r-xr-xr-x. 1 root sunjimeng 67 5月 9 08:15 less1.gz
-r-xr-xr-x. 1 root sunjimeng 80 5月 9 08:16 less2.gz
[root@redis-new01 ~]# gzip -dv Dir
gzip: Dir is a directory -- ignored
zip/unzip:压缩/解压
命令名:zip
功能说明:压缩文件。
语 法:zip [-AcdDfFghjJKlLmoqrSTuvVwXyz$][-b <工 做目录>][-ll][-n <字 尾字符串>][-t <日 期时间>][-<压 缩效率>][压 缩文件][文件...][-i <范本样式>][-x <范本样式>]
补充说明:zip是个使用普遍的压缩程序,文件经它压缩后会另外产生具 有".zip"扩展名 的压缩文件。
参 数:
-A 调 整可执行的自动解压缩文件。
-b<工做目录> 指 定暂时存放文件的目录。
-c 替 每一个被压缩的文件加上注释。
-d 从 压缩文件内删除指定的文件。
-D 压 缩文件内不创建目录名称。
-f 此 参数的效果和指定"-u"参 数相似,但不只更新既有文件,若是某些文件本来不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。
-F 尝 试修复已损坏的压缩文件。
-g 将 文件压缩后附加在既有的压缩文件以后,而非另行创建新的压缩文件。
-h 在 线帮助。
-i<范本样式> 只 压缩符合条件的文件。
-j 只 保存文件名称及其内容,而不存听任何目录名称。
-J 删 除压缩文件前面没必要要的数据。
-k 使 用MS-DOS兼容格 式的文件名称。
-l 压 缩文件时,把LF字符 置换成LF+CR字 符。
-ll 压 缩文件时,把LF+CR字 符置换成LF字符。
-L 显 示版权信息。
-m 将 文件压缩并加入压缩文件后,删除原始文件,即把文件移到压缩文件中。
-n<字尾字符串> 不 压缩具备特定字尾字符串的文件。
-o 以 压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该文件相同。
-q 不显 示指令执行过程。
-r 递 归处理,将指定目录下的全部文件和子目录一并处理。
-S 包 含系统和隐藏文件。
-t<日期时间> 把 压缩文件的日期设成指定的日期。
-T 检 查备份文件内的每一个文件是否正确无误。
-u 更 换较新的文件到压缩文件内。
-v 显 示指令执行过程或显示版本信息。
-V 保 存VMS操做系统的文 件属性。
-w 在 文件名称里假如版本编号,本参数仅在VMS操 做系统下有效。
-x<范本样式> 压 缩时排除符合条件的文件。
-X 不 保存额外的文件属性。
-y 直 接保存符号链接,而非该链接所指向的文件,本参数仅在UNIX之 类的系统下有效。
-z 替 压缩文件加上注释。
-$ 保 存第一个被压缩文件所在磁盘的卷册名称。
-<压缩效率> 压 缩效率是一个介于1-9的 数值。
示例1: 压缩test.MYI
[root@mysql test]# zip test1.zip test.MYI
adding: test.MYI (deflated 42%)
[root@mysql test]#ll
-rw-r--r-- 1 root root 1033755 09-24 10:03 test1.zip
压缩率为8的
[root@mysql test]# zip test2.zip -8 test.MYI
adding: test.MYI (deflated 42%)
[root@mysql test]#ll
-rw-r--r-- 1 root root 1033451 09-24 10:03 test2.zip
示例2: 将当前目录下的全部文件和文件夹所有压缩成test.zip文件,-r表示递归压缩子目录下全部文件
[root@mysql test]# zip -r test.zip ./*
打包目录
[root@mysql test]# zip test2.zip test2/*
示例3: 删除压缩文件test1.zip中test.MYI文件
[root@mysql test]# zip -d test1.zip test.MYI
删除打包文件目录下的文件
[root@mysql test]# zip -d test2.zip test2/ln.log
deleting: tests/ln.log
示例4: 向压缩文件中test1.zip中添加test. MYI文件
[root@mysql test]# zip -m test1.zip test. MYI
示例5: 压缩文件时排除某个文件
[root@mysql test]# zip test3.zip tests/* -x tests/ln.log
=====================================================
命令名: unzip
功 能说明:解压缩zip文 件
语 法:unzip [-cflptuvz][-agCjLMnoqsVX][-P <密 码>][.zip文 件][文件][-d <目录>][-x <文件>] 或 unzip [-Z]
补充说明:unzip为.zip压缩文件的解压缩程序。
参 数:
-c 将 解压缩的结果显示到屏幕上,并对字符作适当的转换。
-f 更 新现有的文件。
-l 显 示压缩文件内所包含的文件。
-p 与-c参数相似,会将解压缩的结果显示到屏幕上,但不会执行任 何的转换。
-t 检 查压缩文件是否正确。,但不解压。
-u 与-f参数相似,可是除了更新现有的文件外,也会将压缩文件中 的其余文件解压缩到目录中。
-v 执 行是时显示详细的信息。或查看压缩文件目录,但不解压。
-z 仅 显示压缩文件的备注文字。
-a 对 文本文件进行必要的字符转换。
-b 不 要对文本文件进行字符转换。
-C 压 缩文件中的文件名称区分大小写。
-j 不 处理压缩文件中原有的目录路径。
-L 将 压缩文件中的所有文件名改成小写。
-M 将 输出结果送到more程 序处理。
-n 解 压缩时不要覆盖原有的文件。
-o 不 必先询问用户,unzip执 行后覆盖原有文件。
-P<密码> 使 用zip的密码选项。
-q 执 行时不显示任何信息。
-s 将 文件名中的空白字符转换为底线字符。
-V 保 留VMS的文件版本信 息。
-X 解 压缩时同时回存文件原来的UID/GID。
[.zip文件] 指定.zip压缩文件。
[文件] 指定 要处理.zip压缩文 件中的哪些文件。
-d<目录> 指 定文件解压缩后所要存储的目录。
-x<文件> 指 定不要处理.zip压 缩文件中的哪些文件。
-Z unzip -Z等 于执行zipinfo指 令。
示例1:将压缩文件text.zip在当前目录下解压缩。
[root@mysql test]# unzip test.zip
示例2:将压缩文件text.zip在指定目录/tmp下解压缩,若是已有相同的文件存在,要求unzip命令不覆盖原先的文件。
[root@mysql test]# unzip -n test.zip -d /tmp
示例3:查看压缩文件目录,但不解压。
[root@mysql test]# unzip -v test.zip
示例4:将压缩文件test.zip在指定目录tmp下解压缩,若是已有相同的文件存在,要求unzip命令覆盖原先的文件。
[root@mysql test]# unzip -o test.zip -d tmp/
RPM 软件包(Fedora, Redhat及相似系统)
rpm -ivh package.rpm 安装一个rpm包
rpm -ivh --nodeeps package.rpm 安装一个rpm包而忽略依赖关系警告
rpm -U package.rpm 更新一个rpm包但不改变其配置文件
rpm -F package.rpm 更新一个肯定已经安装的rpm包
rpm -e package_name.rpm 删除一个rpm包
rpm -qa 显示系统中全部已经安装的rpm包
rpm -qa | grep httpd 显示全部名称中包含 "httpd" 字样的rpm包
rpm -qi package_name 获取一个已安装包的特殊信息
rpm -qg "System Environment/Daemons" 显示一个组件的rpm包
rpm -ql package_name 显示一个已经安装的rpm包提供的文件列表
rpm -qc package_name 显示一个已经安装的rpm包提供的配置文件列表
rpm -q package_name --whatrequires 显示与一个rpm包存在依赖关系的列表
rpm -q package_name --whatprovides 显示一个rpm包所占的体积
rpm -q package_name --scripts 显示在安装/删除期间所执行的脚本l
rpm -q package_name --changelog 显示一个rpm包的修改历史
rpm -qf /etc/httpd/conf/httpd.conf 确认所给的文件由哪一个rpm包所提供
rpm -qp package.rpm -l 显示由一个还没有安装的rpm包提供的文件列表
rpm --import /media/cdrom/RPM-GPG-KEY 导入公钥数字证书
rpm --checksig package.rpm 确认一个rpm包的完整性
rpm -qa gpg-pubkey 确认已安装的全部rpm包的完整性
rpm -V package_name 检查文件尺寸、 许可、类型、全部者、群组、MD5检查以及最后修改时间
rpm -Va 检查系统中全部已安装的rpm包- 当心使用
rpm -Vp package.rpm 确认一个rpm包还未安装
rpm2cpio package.rpm | cpio --extract --make-directories *bin* 从一个rpm包运行可执行文件
rpm -ivh /usr/src/redhat/RPMS/`arch`/package.rpm 从一个rpm源码安装一个构建好的包
rpmbuild --rebuild package_name.src.rpm 从一个rpm源码构建一个 rpm 包
YUM 软件包升级器 - (Fedora, RedHat及相似系统)
yum install package_name 下载并安装一个rpm包
yum localinstall package_name.rpm 将安装一个rpm包,使用你本身的软件仓库为你解决全部依赖关系
yum update package_name.rpm 更新当前系统中全部安装的rpm包
yum update package_name 更新一个rpm包
yum remove package_name 删除一个rpm包
yum list 列出当前系统中安装的全部包
yum search package_name 在rpm仓库中搜寻软件包
yum clean packages 清理rpm缓存删除下载的包
yum clean headers 删除全部头文件
yum clean all 删除全部缓存的包和头文件
DEB 软件包 (Debian, Ubuntu 以及相似系统)
dpkg -i package.deb 安装/更新一个 deb 包
dpkg -r package_name 从系统删除一个 deb 包
dpkg -l 显示系统中全部已经安装的 deb 包
dpkg -l | grep httpd 显示全部名称中包含 "httpd" 字样的deb包
dpkg -s package_name 得到已经安装在系统中一个特殊包的信息
dpkg -L package_name 显示系统中已经安装的一个deb包所提供的文件列表
dpkg --contents package.deb 显示还没有安装的一个包所提供的文件列表
dpkg -S /bin/ping 确认所给的文件由哪一个deb包提供
APT 软件工具 (Debian, Ubuntu 以及相似系统)
apt-get install package_name 安装/更新一个 deb 包
apt-cdrom install package_name 从光盘安装/更新一个 deb 包
apt-get update 升级列表中的软件包
apt-get upgrade 升级全部已安装的软件
apt-get remove package_name 从系统删除一个deb包
apt-get check 确认依赖的软件仓库正确
apt-get clean 从下载的软件包中清理缓存
apt-cache search searched-package 返回包含所要搜索字符串的软件包名称
文件系统分析
badblocks -v /dev/hda1 检查磁盘hda1上的坏磁块
fsck /dev/hda1 修复/检查hda1磁盘上linux文件系统的完整性
fsck.ext2 /dev/hda1 修复/检查hda1磁盘上ext2文件系统的完整性
e2fsck /dev/hda1 修复/检查hda1磁盘上ext2文件系统的完整性
e2fsck -j /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性
fsck.ext3 /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性
fsck.vfat /dev/hda1 修复/检查hda1磁盘上fat文件系统的完整性
fsck.msdos /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性
dosfsck /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性
初始化一个文件系统
mkfs /dev/hda1 在hda1分区建立一个文件系统
mke2fs /dev/hda1 在hda1分区建立一个linux ext2的文件系统
mke2fs -j /dev/hda1 在hda1分区建立一个linux ext3(日志型)的文件系统
mkfs -t vfat 32 -F /dev/hda1 建立一个 FAT32 文件系统
fdformat -n /dev/fd0 格式化一个软盘
mkswap /dev/hda3 建立一个swap文件系统
SWAP文件系统
mkswap /dev/hda3 建立一个swap文件系统
swapon /dev/hda3 启用一个新的swap文件系统
swapon /dev/hda2 /dev/hdb3 启用两个swap分区
备份
dump -0aj -f /tmp/home0.bak /home 制做一个 '/home' 目录的完整备份
dump -1aj -f /tmp/home0.bak /home 制做一个 '/home' 目录的交互式备份
restore -if /tmp/home0.bak 还原一个交互式备份
rsync -rogpav --delete /home /tmp 同步两边的目录
rsync -rogpav -e ssh --delete /home ip_address:/tmp 经过SSH通道rsync
rsync -az -e ssh --delete ip_addr:/home/public /home/local 经过ssh和压缩将一个远程目录同步到本地目录
rsync -az -e ssh --delete /home/local ip_addr:/home/public 经过ssh和压缩将本地目录同步到远程目录
dd bs=1M if=/dev/hda | gzip | ssh user@ip_addr 'dd of=hda.gz' 经过ssh在远程主机上执行一次备份本地磁盘的操做
dd if=/dev/sda of=/tmp/file1 备份磁盘内容到一个文件
tar -Puf backup.tar /home/user 执行一次对 '/home/user' 目录的交互式备份操做
( cd /tmp/local/ && tar c . ) | ssh -C user@ip_addr 'cd /home/share/ && tar x -p' 经过ssh在远程目录中复制一个目录内容
( tar c /home ) | ssh -C user@ip_addr 'cd /home/backup-home && tar x -p' 经过ssh在远程目录中复制一个本地目录
tar cf - . | (cd /tmp/backup ; tar xf - ) 本地将一个目录复制到另外一个地方,保留原有权限及连接
find /home/user1 -name '*.txt' | xargs cp -av --target-directory=/home/backup/ --parents 从一个目录查找并复制全部以 '.txt' 结尾的文件到另外一个目录
find /var/log -name '*.log' | tar cv --files-from=- | bzip2 > log.tar.bz2 查找全部以 '.log' 结尾的文件并作成一个bzip包
dd if=/dev/hda of=/dev/fd0 bs=512 count=1 作一个将 MBR (Master Boot Record)内容复制到软盘的动做
dd if=/dev/fd0 of=/dev/hda bs=512 count=1 从已经保存到软盘的备份中恢复MBR内容
光盘
cdrecord -v gracetime=2 dev=/dev/cdrom -eject blank=fast -force 清空一个可复写的光盘内容
mkisofs /dev/cdrom > cd.iso 在磁盘上建立一个光盘的iso镜像文件
mkisofs /dev/cdrom | gzip > cd_iso.gz 在磁盘上建立一个压缩了的光盘iso镜像文件
mkisofs -J -allow-leading-dots -R -V "Label CD" -iso-level 4 -o ./cd.iso data_cd 建立一个目录的iso镜像文件
cdrecord -v dev=/dev/cdrom cd.iso 刻录一个ISO镜像文件
gzip -dc cd_iso.gz | cdrecord dev=/dev/cdrom - 刻录一个压缩了的ISO镜像文件
mount -o loop cd.iso /mnt/iso 挂载一个ISO镜像文件 cd-paranoia -B 从一个CD光盘转录音轨到 wav 文件中 cd-paranoia -- "-3" 从一个CD光盘转录音轨到 wav 文件中(参数-3) cdrecord --scanbus 扫描总线以识别scsi通道 dd if=/dev/hdc | md5sum 校验一个设备的md5sum编码,例如一张 CD
挂载一个文件系统
mount /dev/hda2 /mnt/hda2 挂载一个叫作hda2的盘 - 肯定目录 '/ mnt/hda2' 已经存在
umount /dev/hda2 卸载一个叫作hda2的盘 - 先从挂载点 '/ mnt/hda2' 退出
fuser -km /mnt/hda2 当设备繁忙时强制卸载
umount -n /mnt/hda2 运行卸载操做而不写入 /etc/mtab 文件- 当文件为只读或当磁盘写满时很是有用
mount /dev/fd0 /mnt/floppy 挂载一个软盘
mount /dev/cdrom /mnt/cdrom 挂载一个cdrom或dvdrom
mount /dev/hdc /mnt/cdrecorder 挂载一个cdrw或dvdrom
mount /dev/hdb /mnt/cdrecorder 挂载一个cdrw或dvdrom
mount -o loop file.iso /mnt/cdrom 挂载一个文件或ISO镜像文件
mount -t vfat /dev/hda5 /mnt/hda5 挂载一个Windows FAT32文件系统
mount /dev/sda1 /mnt/usbdisk 挂载一个usb 捷盘或闪存设备
mount -t smbfs -o username=user,password=pass //WinClient/share /mnt/share 挂载一个windows网络共享
umount卸载不掉的处理方法
已经在/etc/fstab里配置了挂载路径,以下:
[root@kevin ~]# cat /etc/fstab
..........
..........
192.168.10.10:/APP /root/app/ glusterfs defaults,_netdev 0 0
[root@kevin ~]# df -h
..........
..........
192.168.10.10:/APP 2.0T 1.8T 110G 95% /root/app
若是mount挂载掉了,只须要从新挂载便可!
"mount -a"命令表示将/etc/fstab的全部内容从新加载。
[root@kevin ~]# umount /root/app #先卸载
[root@kevin ~]# umount -a #因为已经/etc/fstab里配置了挂载,这里只须要mount -a便可!
=======================================================
若是再执行umount的时候报错以下:
[root@kevin ~]# umount /root/app
umount: /root/app: device is busy.
(In some cases useful info about process that use
the device is found by lsof(8) or fuser(1))
想查看下占用/root/app的进程,还有报错
[root@kevin ~]# umount -m -k /root/app
Cannot stat /root/app: Transport endpoint is not connected
Cannot stat /root/app: Transport endpoint is not connected
Cannot stat /root/app: Transport endpoint is not connected
加-f强制卸载,仍然是报错
[root@kevin ~]# umount -f /root/app
umount2: Device or resource busy
umount: /root/app: device is busy.
(In some cases useful info about process that use
the device is found by lsof(8) or fuser(1))
umount2: Device or resource busy
接着使用lsof命令查看占用/root/app的进程
[root@kevin ~]# lsof |grep /roo/app
bash 14393 root cwd DIR 0,18 4096 9927484108586066995 /root/app/script/ansible/script
kill掉以上进程
[root@kevin ~]# kill -9 14393
这时,就能够顺利进行umount卸载和从新挂载了
[root@kevin ~]# umount /root/app
[root@kevin ~]# mount -a
磁盘空间
df -h 显示已经挂载的分区列表
ls -lSr |more 以尺寸大小排列文件和目录
du -sh dir1 估算目录 'dir1' 已经使用的磁盘空间
du -sk * | sort -rn 以容量大小为依据依次显示文件和目录的大小
rpm -q -a --qf '%10{SIZE}t%{NAME}n' | sort -k1,1n 以大小为依据依次显示已安装的rpm包所使用的空间 (fedora, redhat类系统)
dpkg-query -W -f='${Installed-Size;10}t${Package}n' | sort -k1,1n 以大小为依据显示已安装的deb包所使用的空间 (ubuntu, debian类系统)
文件系统结构和基本操做命令
文件和目录
cd /home 进入 '/ home' 目录'
cd .. 返回上一级目录
cd ../.. 返回上两级目录
cd 进入我的的主目录
cd ~user1 进入我的的主目录
cd - 返回上次所在的目录
pwd 显示工做路径
ls 查看目录中的文件
ls -F 查看目录中的文件
ls -l 显示文件和目录的详细资料
ls -a 显示隐藏文件
ls *[0-9]* 显示包含数字的文件名和目录名
tree 显示文件和目录由根目录开始的树形结构(1)
lstree 显示文件和目录由根目录开始的树形结构(2)
mkdir dir1 建立一个叫作 'dir1' 的目录'
mkdir dir1 dir2 同时建立两个目录
mkdir -p /tmp/dir1/dir2 建立一个目录树
rm -f file1 删除一个叫作 'file1' 的文件'
rmdir dir1 删除一个叫作 'dir1' 的目录'
rm -rf dir1 删除一个叫作 'dir1' 的目录并同时删除其内容
rm -rf dir1 dir2 同时删除两个目录及它们的内容
mv dir1 new_dir 重命名/移动 一个目录
cp file1 file2 复制一个文件
cp dir/* . 复制一个目录下的全部文件到当前工做目录
cp -a /tmp/dir1 . 复制一个目录到当前工做目录
cp -a dir1 dir2 复制一个目录
ln -s file1 lnk1 建立一个指向文件或目录的软连接
ln file1 lnk1 建立一个指向文件或目录的物理连接
touch -t 0712250000 file1 修改一个文件或目录的时间戳 - (YYMMDDhhmm)
iconv -l 列出已知的编码
若是一个文件由另外一个软连接文件而来,则再将这个文件进行硬连接,则硬连接以后的文件仍是软链接文件
[root@bz4citestap1014 test]# touch a
[root@bz4citestap1014 test]# ln -s a a1
[root@bz4citestap1014 test]# ll
total 0
-rw-r--r-- 1 root root 0 Jun 5 15:01 a
lrwxrwxrwx 1 root root 1 Jun 5 15:01 a1 -> a
[root@bz4citestap1014 test]# ln a1 a2
[root@bz4citestap1014 test]# ll
total 0
-rw-r--r-- 1 root root 0 Jun 5 15:01 a
lrwxrwxrwx 2 root root 1 Jun 5 15:01 a1 -> a
lrwxrwxrwx 2 root root 1 Jun 5 15:01 a2 -> a
因为源文件a1自己就是一个软连接文件,因此由它硬连接以后的文件a2仍是软连接文件
[root@bz4citestap1014 test]# rm -rf a2
[root@bz4citestap1014 test]# ll
total 0
-rw-r--r-- 1 root root 0 Jun 5 15:01 a
lrwxrwxrwx 1 root root 1 Jun 5 15:01 a1 -> a
[root@bz4citestap1014 test]# ln a a2
[root@bz4citestap1014 test]# ll
total 0
-rw-r--r-- 2 root root 0 Jun 5 15:01 a
lrwxrwxrwx 1 root root 1 Jun 5 15:01 a1 -> a
-rw-r--r-- 2 root root 0 Jun 5 15:01 a2
因为源文件a是实文件,则它硬连接以后的文件也是实文件,二者内容双向实时同步。
删除a文件,a1文件失效,a2文件不会失效。
再看下面例子
[root@bz4citestap1014 test]# echo "123456" > a
[root@bz4citestap1014 test]# ln a a1
[root@bz4citestap1014 test]# ll
total 8
-rw-r--r-- 2 root root 7 Jun 5 15:04 a
-rw-r--r-- 2 root root 7 Jun 5 15:04 a1
[root@bz4citestap1014 test]# cat a
123456
[root@bz4citestap1014 test]# cat a1
123456
[root@bz4citestap1014 test]# cp a a.bak
[root@bz4citestap1014 test]# echo "abc" >> a
[root@bz4citestap1014 test]# cat a1
123456
abc
[root@bz4citestap1014 test]# cat a.bak
123456
[root@bz4citestap1014 test]# mv a a.bak2
[root@bz4citestap1014 test]# echo "bbbb" >> a.bak2
[root@bz4citestap1014 test]# cat a1
123456
abc
bbbb
就是说:
当源文件cp拷贝到另外一个文件时,连接文件跟源文件内容保持一致(跟源文件的备份文件不会保持一致)
当源文件mv改成另外一个文件时,则连接文件跟源文件mv以后的文件内容保持一致!
这个在对日志文件作连接的场景中须要考虑这个状况(考虑日志轮转切割状况下的连接文件内容的一致性问题)
查看文件内容
cat file1 从第一个字节开始正向查看文件的内容
tac file1 从最后一行开始反向查看一个文件的内容
more file1 查看一个长文件的内容
less file1 相似于 'more' 命令,可是它容许在文件中和正向操做同样的反向操做
head -2 file1 查看一个文件的前两行
tail -2 file1 查看一个文件的最后两行
tail -f /var/log/messages 实时查看被添加到一个文件中的内容
文本处理
cat file1 file2 ... | command <> file1_in.txt_or_file1_out.txt general syntax for text manipulation using PIPE, STDIN and STDOUT
cat file1 | command( sed, grep, awk, grep, etc...) > result.txt 合并一个文件的详细说明文本,并将简介写入一个新文件中
cat file1 | command( sed, grep, awk, grep, etc...) >> result.txt 合并一个文件的详细说明文本,并将简介写入一个已有的文件中
grep Aug /var/log/messages 在文件 '/var/log/messages'中查找关键词"Aug"
grep ^Aug /var/log/messages 在文件 '/var/log/messages'中查找以"Aug"开始的词汇
grep [0-9] /var/log/messages 选择 '/var/log/messages' 文件中全部包含数字的行
grep Aug -R /var/log/* 在目录 '/var/log' 及随后的目录中搜索字符串"Aug"
sed 's/stringa1/stringa2/g' filename.txt 将filename.txt文件中的 "string1" 替换成 "string2"
sed '/^$/d' filename.txt 从filename.txt文件中删除全部空白行
sed '/ *#/d; /^$/d' filename.txt 从filename.txt文件中删除全部注释和空白行
echo 'esempio' | tr '[:lower:]' '[:upper:]' 合并上下单元格内容
sed -e '1d' result.txt 从文件filename.txt 中排除第一行
sed -n '/stringa1/p' 查看只包含词汇 "string1"的行
sed -e 's/ *$//g' filename.txt 删除每一行最后的空白字符
sed -e 's/stringa1//g' filename.txt 从文档中只删除词汇 "string1" 并保留剩余所有
sed -n '1,5p;5q' filename.txt 查看从第一行到第5行内容
sed -n '5p;5q' filename.txt 查看第5行
sed -e 's/00*/0/g' filename.txt 用单个零替换多个零
cat -n file1 标示文件的行数
cat filename.txt | awk 'NR%2==1' 删除filename.txt文件中的全部偶数行
echo a b c | awk '{print $1}' 查看一行第一栏
echo a b c | awk '{print $1,$3}' 查看一行的第一和第三栏
paste file1 file2 合并两个文件或两栏的内容
paste -d '+' file1 file2 合并两个文件或两栏的内容,中间用"+"区分
sort file1 file2 排序两个文件的内容
sort file1 file2 | uniq 取出两个文件的并集(重复的行只保留一份)
sort file1 file2 | uniq -u 删除交集,留下其余的行
sort file1 file2 | uniq -d 取出两个文件的交集(只留下同时存在于两个文件中的文件)
comm -1 file1 file2 比较两个文件的内容只删除 'file1' 所包含的内容
comm -2 file1 file2 比较两个文件的内容只删除 'file2' 所包含的内容
comm -3 file1 file2 比较两个文件的内容只删除两个文件共有的部分
文件搜索
find / -name file1 从 '/' 开始进入根文件系统搜索文件和目录
find / -user user1 搜索属于用户 'user1' 的文件和目录
find /home/user1 -name \*.bin 在目录 '/ home/user1' 中搜索带有'.bin' 结尾的文件
find /usr/bin -type f -atime +100 搜索在过去100天内未被使用过的执行文件
find /usr/bin -type f -mtime -10 搜索在10天内被建立或者修改过的文件
find / -name \*.rpm -exec chmod 755 '{}' \; 搜索以 '.rpm' 结尾的文件并定义其权限
find / -xdev -name \*.rpm 搜索以 '.rpm' 结尾的文件,忽略光驱、捷盘等可移动设备
locate \*.ps 寻找以 '.ps' 结尾的文件 - 先运行 'updatedb' 命令
whereis halt 显示一个二进制文件、源码或man的位置
which halt 显示一个二进制文件或可执行文件的完整路径
find命令:在平常运维工做中使用率极高
find的使用格式以下:
$ find <指定目录> <指定条件> <指定动做>
- <指定目录>: 所要搜索的目录及其全部子目录。默认为当前目录。
- <指定条件>: 所要搜索的文件的特征。
- <指定动做>: 对搜索结果进行特定的处理。
若是什么参数也不加,find默认搜索当前目录及其子目录,而且不过滤任何结果(也就是返回全部文件),将它们全都显示在屏幕上。
find命令用于查找文件和目录,任何位于参数以前的字符串都将被视为欲查找的目录。
find 能够指定查找条件如名称,类型,时间,文件大小,权限和全部者查找,针对多个条件进行与或非的逻辑运算。咱们能够控制find的查找的行为,
还能够和其余命令组合使用。
find
find .
find . -print
三者等效, 查找当前目录下全部的文件和目录(递归子目录),以每行一个文件或者目录的形式列举出,不包含隐藏文件
find lib opt bin
同上,查找指定的多个目录(lib/opt/bin)
1、指定查找条件
1) 按名称查找
find . -name readme.txt
查找当前目录下(递归子目录)的全部名为readme.txt的文件
find . -name \*.txt
find . -name "*.txt"
查找当前目录下(递归子目录)的全部名称以.txt结尾的文件,注意*号的写法,须要前面加\或者放到双引号中
find . -iname \*.txt
默认find是区分大小写的,若是不想区分大小写,请使用-iname替代-name,如上则"abc.TXT"将被查找到
2) 按类型查找
find . -type d
查找当前目录下(递归子目录)的全部目录
find . -type f
查找当前目录下(递归子目录)的全部文件
find . -type l
查找当前目录下(递归子目录)的全部符号连接
3) 按时间查找
=====以小时为单位的时间=====
find 命令三个选项用于按照时间查找,单位都是小时:
mtime — 文件内容上次修改时间
atime — 文件被读取或访问的时间
ctime — 文件状态变化时间
这三个选项都须要配置一个n值使用,能够是-n / n / +n:
-n 小于 n
n 正好与 n 相等
+n 大于 n
find . -mtime -1
查找当前目录下(递归子目录)的全部1小时内修改的文件和目录
find . -mtime +1
查找当前目录下(递归子目录)的全部修改时间超过1小时的文件和目录
find . -mtime 1
查找当前目录下(递归子目录)的全部刚好在1小时前修改的文件和目录
=====以分钟为单位的时间=====
用法和*time相似,mmin、amin和cmin 的不一样在于单位时间是分钟,用于查找在不到1小时的时间内变化了的文件和目录
find . -mmin -10
查找当前目录下(递归子目录)的全部10分钟内修改的文件和目录
find . -mmin +20
查找当前目录下(递归子目录)的全部20分钟外1小时内修改的文件和目录
=====与特定的文件比较=====
-newer,-anewer和-cnewer选项用于查找与特定的文件比较的已修改或访问过的文件,相似mtime,atime和ctime
-newer 指内容最近被修改的文件
-anewer 指最近被读取过的文件
-cnewer 指状态最近发生变化的文件
find . -newer a.txt
查找当前目录下(递归子目录)的全部修改时间在a.txt以后(因此文件更新)的文件和目录
=====按文件大小查找=====
1. -size 选项用于查找知足指定的大小条件的文件(注意不查找目录), +表示大于, -表示小于, 没有+1表示正好等于。
文件大小的单位能够是字节(用c表示), kb(用k表示)。
find . -size -100c
查找当前目录下(递归子目录)的全部文件大小小于100字节的文件
find . -size +100k
查找当前目录下(递归子目录)的全部文件大小大于100k的文件
find . -size 0
查找当前目录下(递归子目录)的全部文件大小为0的文件
2. -empty 查找空文件和空文件夹, 和-size 0不一样的在于-size 0 只查找空文件,或者说-empty -type f 等同于-size 0 :
find . -empty
查找当前目录下(递归子目录)的全部文件大小为0的文件和空文件夹
find . -empty -type f
查找当前目录下(递归子目录)的全部文件大小为0的文件
find . -empty -type d
查找当前目录下(递归子目录)的全部空目录
5) 按权限和全部者查找
find . -perm 777
查找当前目录下(递归子目录)的全部权限为777的文件和目录
find . -perm -u=rwx
查找当前目录下(递归子目录)的全部user权限为rwx的文件和目录
find . -perm -ug=x
查找当前目录下(递归子目录)的全部user和group权限为x的文件和目录
find . -user sky
查找当前目录下(递归子目录)的全部user为sky的文件和目录
find . -group users
查找当前目录下(递归子目录)的全部group为users的文件和目录
2、查找条件的逻辑运算
1. 逻辑与
find . -name "*.java" -size -mmin -10
find . -name "*.java" -a -size -mmin -10
查找当前目录下(递归子目录)的全部名为*.java而且修改时间在10分钟以内的文件,-a是默认选项
2. 逻辑或
find . -name "*.class" -o -name "*.jar"
查找当前目录下(递归子目录)的全部名为*.class或者*.jar的文件和目录
3. 逻辑非
find . ! -user sky
查找当前目录下(递归子目录)的全部user不是sky的文件和目录
3、控制查找的行为
find . -maxdepth 3 -name "*.txt"
查找当前目录下(递归子目录)的全部名为*.txt的文件,目录深度不超过3层
find . -maxdepth 1 -name "*.txt"
查找当前目录下(不递归子目录,由于maxdepth为1)的全部名为*.txt的文件
find . -mindepth 3 -name "*.txt"
查找当前目录下(递归子目录)的全部名为*.txt的文件,目录深度不低于3层
find . -mindepth 1 -name "*.txt"
查找当前目录下的子目录中(递归子目录)的全部名为*.txt的文件,不包含当前目录
find . -depth -name "*.txt"
查找当前目录下(递归子目录)的全部名为*.txt的文件,每一个目录都是先在目录中进行查找,而后才继续查找其子目录
4、 find和其余命令的组合
find . -name "*.jar" -exec ls -l {} \;
find . -name "*.jar" -ls
查找当前目录下(递归子目录)的全部*.jar文件并使用ls -l列出详细信息
find . -name "*.java" -exec grep -H -m 1 HashMap {} \;
查找当前目录下(递归子目录)的全部的含有"HashMap"字样的*.java文件
(grep -H -m 1的意思是打印文件名,并且若是文件中有一次匹配就退出,避免屡次匹配时为这一个文件打印多行)
find . -name "*.sh" -exec mv {} backup \;
查找当前目录下(递归子目录)的全部的*.sh文件并移动到backup目录中、、、、
========================================
例如常用的一个命令场景:
统计代码行数:
find ./ -name "*.[ch]" -o -name "*.cpp" | xargs wc -l
-o:(or)表示两个表达式或的关系。
-a:(and)表示和的关系
xargs将文本内容拆成后面命令的参数。
=======================================
如下列出一些find平常使用的命令场景:
1.当前目录下查找文件
[root@linuxidc.com ~]# find . -name test.txt
./findtest/test.txt
2.指定目录下查找
[root@linuxidc.com ~]# find /root/ -name test.txt
/root/findtest/test.txt
3.忽略大小写查找
[root@linuxidc.com ~]# find /root -iname test.txt
/root/findtest/test.txt
/root/findtest/TEST.txt
4.查找目录
[root@linuxidc.com ~]# find / -type d -name test
/usr/lib64/python2.7/unittest/test
/usr/lib64/python2.7/test
/usr/src/kernels/3.10.0-229.14.1.el7.x86_64/include/config/test
/usr/src/kernels/3.10.0-229.14.1.el7.x86_64/lib/raid6/test
5.按名称查找php文件
[root@linuxidc.com zabbix]# find . -type f -name events.php
./events.php
6.在目录中查找全部的php文件
[root@linuxidc.com zabbix]# find . -type f -name "*.php"
./graphs.php
./tr_logform.php
./authentication.php
./popup_httpstep.php
./image.php
..........
7.查找文件权限是777的
[root@linuxidc.com ~]# find . -type f -perm 0777 -print
./findtest/test.txt
8.查找文件权限不是777的
[root@linuxidc.com ~]# find . -type f ! -perm 0777 -print
9.查找644权限的SGID文件
[root@linuxidc.com ~]# find / -perm 2644
10.查找权限为551的粘着位文件
[root@linuxidc.com ~]# find / -perm 1551
11.查找全部SUID文件
root@linuxidc.com ~]# find / -perm /u=s
12.查找全部SGID文件
[root@linuxidc.com ~]# find / -perm /g+s
13.查找全部只读文件
[root@linuxidc.com ~]# find / -perm /u=r
14.查找全部可执行文件
[root@linuxidc.com ~]# find / -perm /a=x
15.查找全部777文件,并改成644
反斜杠用来告诉find什么时候命令结束
[root@linuxidc.com ~]# find / -type f -perm 0777 -print -exec chmod 644 {} \;
16.查找全部777的目录,并改成755
[root@linuxidc.com ~]# find / -type d -perm 777 -print -exec chmod 755 {} \;
17.查找并删除某个文件
[root@linuxidc.com ~]# find . -type f -name "test.txt" -exec rm -f {} \;
18.查找并删除多个文件
[root@linuxidc.com ~]# find . -type f -name "*.txt" -exec rm -f {} \;
19.查找全部的空文件
[root@linuxidc.com ~]# find /tmp -type f -empty
20.查找全部空目录
[root@linuxidc.com ~]# find /tmp -type d -empty
21.查找全部隐藏文件
[root@linuxidc.com ~]# find /tmp -type f -name ".*"
22.根据用户查找某个文件
[root@linuxidc.com ~]# find / -user root -name test.txt
23.根据用户查找全部的文件
在/home下属于某个用户的全部文件
[root@linuxidc.com ~]# find /home -user zabbix
/home/zabbix
/home/zabbix/.bash_history
/home/zabbix/.config
/home/zabbix/.config/abrt
/home/zabbix/mysql-community-release-el7-5.noarch.rpm
/home/zabbix/.lesshst
/home/zabbix/.cache
/home/zabbix/.cache/abrt
/home/zabbix/.cache/abrt/lastnotification
/home/zabbix/.bash_logout
/home/zabbix/.viminfo
/home/zabbix/.mysql_history
/home/zabbix/.bashrc
/home/zabbix/.bash_profile
24./home目录下查找某个组的全部文件
[root@linuxidc.com ~]# find /home -group developer
25./home目录下忽略大小写查找用户zabbix的全部文件
[root@linuxidc.com ~]# find /home -user zabbix -iname "*.txt"
26.查找50天以内修改过的文件
[root@linuxidc.com ~]# find / -mtime 50
27.查找50天以内被存取过的文件
[root@linuxidc.com ~]# find / -atime 50
28.查找50-100天以内修改过的文件
[root@linuxidc.com ~]# find / -atime +50 -mtime -100
29.查找1个小时以内有变化的文件
[root@linuxidc.com ~]# find / -cmin -60
30.查找1个小时以内修改过的文件
[root@linuxidc.com ~]# find / -mmin -60
31.查找1个小时以内被存取过的文件
[root@linuxidc.com ~]# find / -amin -60
32.查找全部的50M大小的文件
[root@linuxidc.com ~]# find / -size 50M
33.查找50-100M之间的文件
[root@linuxidc.com ~]# find / -size +50M -size -100M
34.查找并删除100M大小的文件
[root@linuxidc.com ~]# find / -size +100M -exec rm -rf {} \;
35.查找并删除指定类型,指定大小的文件
[root@linuxidc.com ~]# find / -type f -name *.mp3 -size +10M -exec rm {} \;
xargs命令:这个命令的使用率很高
可参考:http://man.linuxde.net/xargs
xargs这个命令能够变多行为一行输出
结合管道符|使用,表示将前面命令结果输出
[root@slave-server ~]# rpm -qa|grep ssh
openssh-5.3p1-118.1.el6_8.x86_64
openssh-server-5.3p1-118.1.el6_8.x86_64
libssh2-1.4.2-2.el6_7.1.x86_64
openssh-clients-5.3p1-118.1.el6_8.x86_64
[root@slave-server ~]# rpm -qa|grep ssh|xargs
openssh-5.3p1-118.1.el6_8.x86_64 openssh-server-5.3p1-118.1.el6_8.x86_64 libssh2-1.4.2-2.el6_7.1.x86_64 openssh-clients-5.3p1-118.1.el6_8.x86_64
[root@slave-server ~]# cat test.file
dfs 123 45 56
asdf ii iij jnh
fg hy 7u 8i 9o
0o o00 67y jhsdafhja asdfasdfasdfasdfasdfs
[root@slave-server ~]# cat test.file|xargs
dfs 123 45 56 asdf ii iij jnh fg hy 7u 8i 9o 0o o00 67y jhsdafhja asdfasdfasdfasdfasdfs
xargs 结合-n选项,表示以n个字符为一行行输出:
[root@slave-server ~]# cat test.file |xargs -n2
dfs 123
45 56
asdf ii
iij jnh
fg hy
7u 8i
9o 0o
o00 67y
jhsdafhja asdfasdfasdfasdfasdfs
[root@slave-server ~]# cat test.file |xargs -n5
dfs 123 45 56 asdf
ii iij jnh fg hy
7u 8i 9o 0o o00
67y jhsdafhja asdfasdfasdfasdfasdfs
xargs结合-d选项表示自定义一个定界符:
[root@slave-server ~]# echo "nameXnameXnameXname" | xargs -dX
name name name name
[root@slave-server ~]# echo "nameXnameXnameXname" | xargs -dX -n1
name
name
name
name
[root@slave-server ~]# echo "nameXnameXnameXname" | xargs -dX -n2
name name
name name
[root@slave-server ~]# echo "nameXnameXnameXname" | xargs -dX -n3
name name name
name
xargs结合选项-I,使用-I指定一个替换字符串{},这个字符串在xargs扩展时会被替换掉,当-I与xargs结合使用,每个参数命令都会被执行一次:
[root@slave-server ~]# cat arg.txt
aaa
bbb
ccc
[root@slave-server ~]# cat arg.txt |xargs
aaa bbb ccc
[root@slave-server ~]# cat arg.txt |xargs -I {} echo wang {} -l
wang aaa -l
wang bbb -l
wang ccc -l
[root@slave-server ~]# cat arg.txt |xargs -I {} echo wang {} shibo
wang aaa shibo
wang bbb shibo
wang ccc shibo
中止php进程
[root@slave-server ~]# ps -ef|grep php|grep -v grep|awk -F" " '{print $2}'|xargs kill -9
[root@slave-server opt]# ll
total 12
-rw-r--r--. 1 root root 0 Jan 6 07:09 aa
-rw-r--r--. 1 root root 0 Jan 6 07:09 bb
-rw-r--r--. 1 root root 0 Jan 6 07:09 dd
-rw-r--r--. 1 root root 24 Jan 6 06:23 haha.txt
-rw-r--r--. 1 root root 17 Jan 6 06:29 hehe.txt
-rw-r--r--. 1 root root 6 Jan 6 06:32 test.sh
-rw-r--r--. 1 root root 0 Jan 6 07:09 vv
[root@slave-server opt]# ls -l|awk -F" " '{print $9}'|xargs
aa bb dd haha.txt hehe.txt test.sh vv
文件的权限 - 使用 “+” 设置权限,使用 “-“ 用于取消
ls -lh 显示权限
ls /tmp | pr -T5 -W$COLUMNS 将终端划分红5栏显示
chmod ugo+rwx directory1 设置目录的全部人(u)、群组(g)以及其余人(o)以读(r )、写(w)和执行(x)的权限
chmod go-rwx directory1 删除群组(g)与其余人(o)对目录的读写执行权限
chown user1 file1 改变一个文件的全部人属性
chown -R user1 directory1 改变一个目录的全部人属性并同时改变改目录下全部文件的属性
chgrp group1 file1 改变文件的群组
chown user1:group1 file1 改变一个文件的全部人和群组属性
find / -perm -u+s 罗列一个系统中全部使用了SUID控制的文件
chmod u+s /bin/file1 设置一个二进制文件的 SUID 位 - 运行该文件的用户也被赋予和全部者一样的权限
chmod u-s /bin/file1 禁用一个二进制文件的 SUID位
chmod g+s /home/public 设置一个目录的SGID 位 - 相似SUID ,不过这是针对目录的
chmod g-s /home/public 禁用一个目录的 SGID 位
chmod o+t /home/public 设置一个文件的 STIKY 位 - 只容许合法全部人删除文件
chmod o-t /home/public 禁用一个目录的 STIKY 位
文件的特殊属性 - 使用 “+” 设置权限,使用 “-“ 用于取消
chattr +a file1 只容许以追加方式读写文件
chattr +c file1 容许这个文件能被内核自动压缩/解压
chattr +d file1 在进行文件系统备份时,dump程序将忽略这个文件
chattr +i file1 设置成不可变的文件,不能被删除、修改、重命名或者连接
chattr +s file1 容许一个文件被安全地删除
chattr +S file1 一旦应用程序对这个文件执行了写操做,使系统马上把修改的结果写到磁盘
chattr +u file1 若文件被删除,系统会容许你在之后恢复这个被删除的文件
lsattr 显示特殊的属性
用户和群组
groupadd group_name 建立一个新用户组
groupdel group_name 删除一个用户组
groupmod -n new_group_name old_group_name 重命名一个用户组
useradd -c "Name Surname " -g admin -d /home/user1 -s /bin/bash user1 建立一个属于 "admin" 用户组的用户
useradd user1 建立一个新用户
userdel -r user1 删除一个用户 ( '-r' 排除主目录)
usermod -c "User FTP" -g system -d /ftp/user1 -s /bin/nologin user1 修改用户属性
passwd 修改口令
passwd user1 修改一个用户的口令 (只容许root执行)
chage -E 2005-12-31 user1 设置用户口令的失效期限
pwck 检查 '/etc/passwd' 的文件格式和语法修正以及存在的用户
grpck 检查 '/etc/passwd' 的文件格式和语法修正以及存在的群组
newgrp group_name 登录进一个新的群组以改变新建立文件的预设群组
chmod命令:改变权限
经常使用用法:chmod -R xxxx FILE
含义:设置文件或者目录的权限属性,加上R选项,表示递归设置目录下文件和目录的权限属性
上面有4个x,每一个x的值为0-7,若是少于4个,那么默认在前面用0值补全,即“77”等价于“0077”。为了简单起见,咱们每次使用的时候,都指定4个x好了。
第一个"x":设置SUID(4),SGID(2),STICKY(1)
第二个"x":设置文件属主的r权限(4),w写权限(2),x执行权限(1)
第三个"x":设置文件所属组的r权限(4),w写权限(2),x执行权限(1)
第四个"x":设置其余用户的r权限(4),w写权限(2),x执行权限(1)
备注:
设置了SUID,会把文件属主的"rwx"中的x替换为s[文件属主具备x权限]或者S[文件属主不具备x权限]
设置了SGID,会把文件所属组的"rwx"中的x替换为s[文件所属组具备x权限]或者S[文件所属组不具备x权限]
设置了STICKY,会把其余用户的"rwx"中的x替换为t[其余用户具备x权限]或者T[其余用户不具备x权限]
另外有一个问题须要注意:
1)在清除通常文件的SUID,SGID,STICKY权限的时候,可使用"chmod 0xxx"的形式
2)在清除目录的SUID,SGID权限的时候,不可使用"chmod 0xxx"的形式。在[1]中也提到了一个解决方案,
就是在原先的4个x的基础上,再加一个或多个前置x,咱们取1位0好了,即"0xxxx"的形式。
综上,咱们使用"0xxxx"(指定5位)来设置文件属主,文件所属组,其余用户的rwx权限和SUID,SGID,STICKY权限。
chown命令:改变属主
经常使用用法:chown [-R] OWNER FILE
含义:改变文件的全部者,加上R选项,表示递归
一般使用时会加上改变所属组的部分,即"所属者.所属组" 或者 "所属者:所属组"
chown [-R] OWNER.GROUP FILE
chown [-R] OWNER:GROUP FILE
chgrp命令:改变属组
经常使用用法:chgrp [-R] GROUP FILE
含义:将FILE的用户组改成GROUP,若是指定了-R选项,那么递归改变
usemod针对系统用户的修改命令
经常使用参数:
-a|--append ##把用户追加到某些组中,仅与-G选项一块儿使用
-c|--comment ##修改/etc/passwd文件第五段comment
-d|--home ##修改用户的家目录一般和-m选项一块儿使用
-e|--expiredate ##指定用户账号禁用的日期,格式YY-MM-DD
-f|--inactive ##用户密码过时多少天后采用就禁用该账号,0表示密码已过时就禁用账号,-1表示禁用此功能,默认值是-1
-g|--gid ##修改用户的gid,改组必定存在
-G|--groups ##把用户追加到某些组中,仅与-a选项一块儿使用
-l|--login ##修改用户的登陆名称
-L|--lock ##锁定用户的密码
-m|--move-home ##修改用户的家目录一般和-d选项一块儿使用
-s|--shell ##修改用户的shell
-u|--uid ##修改用户的uid,该uid必须惟一
-U|--unlock ##解锁用户的密码
示例说明:
1)新建用户test,密码test,另外添加usertest组
[root@kevin-test ~]# useradd test
[root@kevin-test ~]# echo "test" | passwd --stdin test
[root@kevin-test ~]# groupadd usertest
2)把test用户加入usertest组
[root@kevin-test ~]# usermod -aG usertest test ##多个组之间用空格隔开
[root@kevin-test ~]# id test
uid=500(test) gid=500(test) groups=500(test),501(usertest)
3)修改test用户的家目录
[root@kevin-test ~]# usermod -md /home/usertest
[root@kevin-test ~]# ls /home
usertest
4)修改用户名
[root@kevin-test ~]# usermod -l testnew(新用户) test(老用户)
[root@kevin-test ~]# id testnew
uid=500(testnew) gid=500(test) groups=500(test),501(usertest)
5)锁定testnew的密码
[root@kevin-test ~]# sed -n '$p' /etc/shadow
testnew:$6$1PwPVBn5$o.MIEYONzURQPvn/YqSp69kt2CIASvXhOnjv/tZ5m4NN6bJyLjCG7S6vmji/PFDfbyITdm1WmtV45CfHV5vux/:15594:0:99999:7:::
[root@kevin-test ~]# usermod -L testnew
[root@kevin-test ~]# sed -n '$p' /etc/shadow
testnew:!$6$1PwPVBn5$o.MIEYONzURQPvn/YqSp69kt2CIASvXhOnjv/tZ5m4NN6bJyLjCG7S6vmji/PFDfbyITdm1WmtV45CfHV5vux/:15594:0:99999:7:::
6)解锁testnew的密码
[root@kevin-test ~]# usermod -U testnew
[root@kevin-test ~]# sed -n '$p' /etc/shadow
testnew:$6$1PwPVBn5$o.MIEYONzURQPvn/YqSp69kt2CIASvXhOnjv/tZ5m4NN6bJyLjCG7S6vmji/PFDfbyITdm1WmtV45CfHV5vux/:15594:0:99999:7:::
7)修改用户的shell
[root@kevin-test ~]# sed '$!d' /etc/passwd
testnew:x:500:500::/home/usertest:/bin/bash
[root@kevin-test ~]# usermod -s /bin/sh testnew
[root@kevin-test ~]# sed -n '$p' /etc/passwd
testnew:x:500:500::/home/usertest:/bin/sh
也能够手动编辑 vi /etc/passwd 找到testnew编辑保存便可
[root@kevin-test ~]# vim /etc/password
8)修改用户的UID
[root@kevin-test ~]# usermod -u 578 testnew (UID必须惟一)
[root@kevin-test ~]# id testnew
uid=578(testnew) gid=500(test) groups=500(test),501(usertest)
9)修改用户的GID
[root@kevin-test ~]# groupadd -g 578 test1
[root@kevin-test ~]# usermod -g 578 testnew (578组必定要存在)
[root@kevin-test ~]# id testnew
uid=578(testnew) gid=578(test1) groups=578(test1),501(usertest)
10)指定账号过时日期
[root@kevin-test ~]# sed -n '$p' /etc/shadow
testnew:$6$1PwPVBn5$o.MIEYONzURQPvn/YqSp69kt2CIASvXhOnjv/tZ5m4NN6bJyLjCG7S6vmji/PFDfbyITdm1WmtV45CfHV5vux/:15594:0:99999:7:::
[root@kevin-test ~]# usermod -e 2012-09-11 testnew
[root@kevin-test ~]# sed -n '$p' /etc/shadow
testnew:$6$1PwPVBn5$o.MIEYONzURQPvn/YqSp69kt2CIASvXhOnjv/tZ5m4NN6bJyLjCG7S6vmji/PFDfbyITdm1WmtV45CfHV5vux/:15594:0:99999:7::15594:
11)指定用户账号密码过时多少天后,禁用该账号
[root@kevin-test ~]# usermod -f 0 testnew
[root@kevin-test ~]# sed -n '$p' /etc/shadow
testnew:$6$1PwPVBn5$o.MIEYONzURQPvn/YqSp69kt2CIASvXhOnjv/tZ5m4NN6bJyLjCG7S6vmji/PFDfbyITdm1WmtV45CfHV5vux/:15594:0:99999:7:0:15594:
find命令:查找文件
1、经常使用用法
find path [-maxdepth N] test
2、含义与选项
2.一、含义
在指定路径下,找到符合条件的文件和目录。
2.二、选项表示的意思
"path":表示查找范围的路径。
"-maxdepth N":表示查找的最深深度为N层。
"test":查找须要知足的条件。
3、经常使用的test
3.一、关于文件时间的几个test
test 说明
-amin n 以最后访问文件block节点中数据的时间为判断依据,以多少个分钟为单位
-atime n 以最后访问文件block节点中数据的时间为判断依据,以多少个24小时为单位
-cmin n 以最后修改文件inode节点中元数据的时间为判断依据,以多少个分钟为单位
-ctime n 以最后修改文件inode节点中元数据的时间为判断依据,以多少个24小时为单位
-mmin n 以最后修改文件block节点中数据的时间为判断依据,以多少个分钟为单位
-mtime n 以最后修改文件block节点中数据的时间为判断依据,以多少个24小时为单位
须要注意:在以上6个选项中,数字"n"有3种形式,分别是:n,+n,-n
为了更加透彻完整地理解,能够概括获得以下结论。
3.1.1)以"多少个分钟"为单位的选项
第一种状况"n"为"n"
(FileTime-(NowTime-n*UNIT))>0 && (FileTime-(NowTime-n*UNIT))<=UNIT
第二种状况"n"为"+n"
(FileTime-(NowTime-n*UNIT))<0
第三种状况"n"为"-n"
(FileTime-(NowTime-n*UNIT))>0
"n"和"-n"的状况具备必定的重复区域,即某个时刻"n"可以找到某个文件,"-n"也可以找到相同的文件。
3.1.2)以"多少个24小时"为单位的选项
第一种状况"n"为"n"
(FileTime-(NowTime-(n+1)*UNIT))>0 && (FileTime-(NowTime-(n+1)*UNIT))<=UNIT
第二种状况"n"为"+n"
(FileTime-(NowTime-(n+1)*UNIT))<0
第三种状况"n"为"-n"
(FileTime-(NowTime-n*UNIT))>0
注意:这里没有"n+1",避免了"n"和"-n"的状况下的重复区域。
特别备注:
1)在上述描述中,系统当前时间(NowTime)和文件相应字段的时间(FileTime)都表示成以秒为单位;在以"多少个分钟"为单位的选项中,
UNIT=60(1分钟有60秒),在以"多少个24小时"为单位的选项中,UNIT=24*60*3600(24小时有24*60*3600秒)
2)加了"-daystart"选项后,NowTime就变为当日午夜时间
3.1.3)举一些例子来看
先假设系统当前时间是"2015-06-09 13:35:50"。
示例1
那么find . -amin 10命令,查找的文件的"atime"范围:
2015-06-09 13:25:51 -- 2015-06-09 13:26:50
示例2
那么find . -amin -10命令,查找的文件的"atime"范围:
2015-06-09 > 13:25:50[所以,"2015-06-09 13:26:30"就既能经过-amin 10获得,也能经过-amin -10获得]
示例3
那么find . -amin +10命令,查找的文件的"atime"范围:
2015-06-09 < 13:25:50
示例4
那么find . -atime 5命令,查找的文件的"atime"范围:
2015-06-03 13:35:51 -- 2015-06-04 13:35:50
示例5
那么find . -atime -5命令,查找的文件的"atime"范围:
2015-06-04 > 13:35:50
示例6
那么find . -atime +5,查找的文件的"atime"范围
2015-06-03 < 13:35:50
3.二、关于文件权限的test
test 说明
-perm mode 目的文件的权限跟"mode"一致
-perm -mode 目的文件的权限包含了"mode"
-perm /mode 目的文件的权限跟"mode"有交集
3.三、关于文件类型的test
关于文件类型的test为"-type c",其中"c"表示文件类型特征码,对于文件类型特征码的介绍:
b block (buffered) special
c character (unbuffered) special
d directory
p named pipe (FIFO)
f regular file
l symbolic link;
s socket
D door (Solaris)
3.四、关于文件所属用户的test
"-user uname":表示属于"uname"这个用户的文件,"uname"能够是"用户名称",也能够是"用户ID,即uid"。
3.五、关于文件所属用户组的test
"-group gname":表示属于"gname"这个用户组的文件,"gname"能够是"用户组名称",也能够是"用户组ID,即gid"。
3.六、关于文件名称的test
"-name pattern":文件名符合"pattern"这个正则表达式的文件。
4、其余
"find"命令的完整定义:
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
可是在使用"find"命令的时候,通常不解析遇到的软符号连接文件,若是解析的话很容易形成递归死循环,而咱们通常也不使用调试和优化选项,
所以"-H","-L","-P","-D","-O"这些选项通常不经常使用。
"expression"中包括了"options","tests","actions",以及它们之间的"operators"这四个部分。可是"options"通常也没有什么用,除了
"-maxdepth"这个"option"],"actions"也比较复杂,于是咱们能够选择先使用简单的"find"命令,找出符合条件的文件,而后再经过管道或者
脚本的方式进行操做。 所以,最终"-H","-L","-P","-D","-O","expression"中的"options","actions","operators"都不须要。
ln命令:创建符号连接文件
经常使用用法:ln [-s] TARGET LINK_NAME
含义:
有-s选项,表示创建到TARGET的软符号连接文件,软符号连接文件的文件名为LINK_NAME
没有-s选项,表示创建到TARGET的硬符号连接文件,硬符号连接文件的文件名为LINK_NAME
注意:当一个区分好比/分区空间快爆满时,能够将这个分区下的大文件先mv到别的大分区下(好比home区分),而后再将这个大文件从home分区软连接回到/分区下
mount命令
格式:mount [-参数] [设备名称] [挂载点]
其中经常使用的参数有:
-a 安装在/etc/fstab文件中类出的全部文件系统。
-f 假装mount,做出检查设备和目录的样子,但并不真正挂载文件系统。
-n 不把安装记录在/etc/mtab 文件中。
-r 讲文件系统安装为只读。
-v 详细显示安装信息。
-w 将文件系统安装为可写,为命令默认状况。
-t 指定设备的文件系统类型,常见的有:
ext2 linux目前经常使用的文件系统
msdos MS-DOS的fat,就是fat16
vfat windows98经常使用的fat32
nfs 网络文件系统
iso9660 CD-ROM光盘标准文件系统
ntfs windows NT/2000/XP的文件系统
auto 自动检测文件系统
-o 指定挂载文件系统时的选项,有些也可写到在/etc/fstab中。经常使用的有:
defaults 使用全部选项的默认值(auto、nouser、rw、suid)
auto/noauto 容许/不容许以 –a选项进行安装
dev/nodev 对/不对文件系统上的特殊设备进行解释
exec/noexec 容许/不容许执行二进制代码
suid/nosuid 确认/不确认suid和sgid位
user /nouser 容许/不容许通常用户挂载
codepage=XXX 代码页
iocharset=XXX 字符集
ro 以只读方式挂载
rw 以读写方式挂载
remount 从新安装已经安装了的文件系统
loop 挂载回旋设备
须要注意:
挂载点必须是一个已经存在的目录,这个目录能够不为空,但挂载后这个目录下之前的内容将不可用,umount之后会恢复正常。
使用多个参数的时候,-o只用一次,参数之间用半角逗号隔开:
[root@redis-new01 ~]# mount –o remount,rw /
例如要挂载windows下文件系统为FAT32的D盘,通常而言在Linux下这个分区对应/dev/hda5,根据具体的分区状况会有不一样,
这里就以hda5来举例说明:
[root@redis-new01 ~]# mkdir /mnt/hda5 //建立hda5的目录做为挂载点,位置和目录名可自定义//
[root@redis-new01 ~]# mount -t vfat /dev/hda5 /mnt/hda5
通常而言,Linux会自动探测分区的文件系统,除非让你指定时,不然-t vfat 能够省掉。
[root@redis-new01 ~]# mount /dev/hda5 /mnt/hda5
这样就能够进入/mnt/hda5目录去访问分区中的资源了。
=====为何mount上分区后显示不了中文文件为问号/乱码?=====
显示问号代表你的系统中没有可识别使用的中文字体,请先安装中文字体。确保你的系统已经能够很好的显示中文。显示为乱码通常是mount默认
使用的文件系统编码和文件系统中文件的实际编码不一致形成的。要想正常显示中文文件,mount时须要用到 -o 参数里的codepage和iocharset
选项。codepage指定文件系统的代码页,简体中文中文代码是936;iocharset指定字符集,简体中文通常用cp936或gb2312。
[root@redis-new01 ~]# mount –o iocharset=gb2312 codepage=936 /dev/hda5 /mnt/hda5
通常来讲 mount –o iocharset=cp936 /dev/hda5 /mnt/hda5 就能够解决问题了。
若是这样作了之后还有问题,请尝试UTF-8编码:
[root@redis-new01 ~]# mount –o iocharset=utf8 /dev/hda5 /mnt/hda5
=====为何mount上去之后分区普通用户不可写?=====
mount时加上 –o umask=000 便可:
[root@redis-new01 ~]# mount –o umask=000, iocharset=cp936 /dev/hda5 /mnt/hda5
=====为何mount上去后的分区中的文件都变成短文件名了?=====
这是文件系统挂错的缘由,将FAT32挂载成FAT16时就会出现这种状况,先umount,而后用 –t vfat 从新挂载便可解决问题。
[root@redis-new01 ~]# mount –t vat /dev/hda5 /mnt/hda5
=====为何不能mount ntfs分区?======
这是内核不支持NTFS文件系统的缘由,请从新编译内核或者安装内核的NTFS文件系统支持包,以使得内核有NTFS文件系统的支持。
=====如何挂载U盘和mp3?=====
若是计算机没有其它SCSI设备和usb外设的状况下,插入的U盘的设备路径是 /dev/sda1,用命令:
[root@redis-new01 ~]# mkdir /mnt/u
[root@redis-new01 ~]# mount /dev/sda1 /mnt/u
挂载便可。
=====能够直接使用iso文件吗?=====
能够,就是mount的这一选项使得Linux下有免费虚拟光驱的说法,具体用法是:
[root@redis-new01 ~]# mkdir /mnt/iso
[root@redis-new01 ~]# mount –o loop linux.iso /mnt/iso
固然,挂载之后挂载点/mnt/iso也是只读的。
=====怎么不能够mount iso文件?=====
通常而言,大多数的发行版使用的内核均已将loop设备的支持编译进去了,可是也有没有的状况,因此请确保系统所使用的内核支持loop设备。
第二种状况是iso文件被放置到了NTFS或其它只读文件系统中了。挂载loop 设备必需要求挂载到一个可写的分区中,目前Linux内核对NTFS
文件系统的写支持很是有限,请将iso文件复制到其它可写文件系统中后再挂载。
=====如何挂载光驱和软驱=====
通常来讲CDROM的设备文件是/dev/hdc,软驱的设备名是/dev/fd0
[root@redis-new01 ~]# mkdir /mnt/cdrom
[root@redis-new01 ~]# mount /dev/hdc /mnt/cdrom //挂载光驱 //
[root@redis-new01 ~]# mkdir /mnt/floppy
[root@redis-new01 ~]# mount /dev/fd0 /mnt/floppy //挂载软驱 //
=====为什么挂载的CD-ROM不能显示中文文件?=====
使用 –o iocharset=cp936 选项通常能解决问题,不然使用utf-8编码。
[root@redis-new01 ~]# mount –o iocharset=cp936 /dev/hdc /mnt/cdrom
=====如何开机自动挂载分区?=====
每次挂载都要输入那么长的命令的确是繁琐了些,只要将分区信息写到/etc/fstab文件中便可实现系统启动的自动挂载,例如对于/dev/hda5的自动挂载添加以下的行便可:
/dev/hda5 /mnt/hda5 vfat defaults,iocharset=cp936, rw 0 0
===== 如何挂载samba 分区?=====
[root@redis-new01 ~]# mkdir /mnt/share
[root@redis-new01 ~]# mount -t smbfs -o username=root,password=abc,codepage=936,iocharset=gb2312//192.168.1.100/share /mnt/share
若是中文显示不正常请尝试UTF-8编码。固然能够写到fstab中实现自动挂载。
=====mount --bind是什么意思?=====
mount --bind 是将一个目录中的内容挂载到另外一个目录上,用法是
[root@redis-new01 ~]# mount --bind olddir newdir
该命令使得本身搭建的FTP要共享某个目录的时候变得特别方便。若是要取消mount用命令:
[root@redis-new01 ~]# mount --move olddir newdir 便可。
若是mount --bind 也想写入fstab中的话格式以下:
olddir newdir none bind 0 0
=====umount基本用法是?=====
譬如 /dev/hda5 已经挂载在/mnt/hda5上,用一下三条命令都可卸载挂载的文件系统
[root@redis-new01 ~]# umount /dev/hda5
[root@redis-new01 ~]# umount /mnt/hda5
[root@redis-new01 ~]# umount /dev/hda5 /mnt/hda5
=====为何umount的时候老显示 device busy?=====
这是由于有程序正在访问这个设备,最简单的办法就是让访问该设备的程序退出之后再umount。
可能有时候用户搞不清除到底是什么程序在访问设备,若是用户不急着umount,则能够用:
[root@redis-new01 ~]# umount -l /mnt/hda5
来卸载设备。选项 –l 并非立刻umount,而是在该目录空闲后再umount。
还能够先用命令 ps aux 来查看占用设备的程序PID,而后用命令kill来杀死占用设备的进程,这样就umount的很是放心了。
方法一:
# fuser -m -v /nfs_old/
/nfs_old/: root 2699 ..c.. bash
root 2999 ..c.. su
如上所示,有两个进程占用了,将其kill掉,再从新取消挂载。
# kill -9 2699 2999
# umount /nfs_old/
方法二:
# umount -l /nfs_old/
方法三:
# fuser -km /nfs_old/
=========================案例说明=========================
在作项目时,客户须要FTP同时访问两个目录,即实现一个ftp帐号同时访问两个目录。要清楚,在建FTP时,都是一个用户对应一个目录,
当FTP用户登陆后,就只访问当前目录。但若是须要访问到其余目录,这个该如何解决呢?
刚开始觉得使用连接能够实现这个功能,可是发现连接成功了,可是使用ftp是不能够访问的,不成功。
最终解决方法:使用mount的方法,把目录挂到,原来的目录中。
例如:
用户test要同时访问到目录/data一、/data2
在test用户家目录下新建两个目录test一、test2
然把把/data一、/data2挂到对应的test一、test2
[root@huanqiu ~][root@redis-new01 ~]# mkdir /home/test/{test1,test2}
[root@huanqiu ~][root@redis-new01 ~]# mount --bind /data1 /home/test/test1
[root@huanqiu ~][root@redis-new01 ~]# mount --bind /data2 /home/test/test2
这样就可使用test帐号登录ftp后,同时访问到/data一、/data2目录了。
mkdir命令:创建目录
经常使用用法:
含义:建立目录;
若是是建立层次目录结构(即建立连级目录),就加上-p参数。
例如:
mkdir test1 test2 ...
mkdir -p test/test1/test2/test3
mkdir test/test{1,2,3,4,5}
umask命令:文件默认权限
经常使用用法:umask [mask]
含义:
一、没有"mask"参数,表示打印当前的mask设置值
二、有"mask"参数,表示设置当前的mask值为"mask"
三、mask值的用途
mask值表示建立文件时默认须要减去的权限
建立通常文件时,默认的权限是"0666-mask",即0666减去umask码值
建立目录时,默认的权限是"0777-mask",即0777减去umask码值
注意,以上的相减操做不能经过数字形式直接相减,这会产生错误,须要经过对应的rwx形式进行操做
好比"0666-0003"
数字直接相减结果是:0663
正确的方式是:"rw-rw-rw-"减去"-------wx",结果为"rw-rw-r--"
四、mask设置值是跟当前的shell环境相关联的设置
which命令:在$PATH变量指定的路径中查找文件
经常使用用法:which -a filename
含义:
在$PATH变量指定的路径中查找全部文件名为filename的文件,并将全部找到的文件的路径打印出来
备注:
1)须要所有匹配,而不能是部分匹配
好比
“which ps”的结果是"/bin/ps"
"which p"的结果是空白,"/bin/ps"不是合法结果
2)须要匹配文件名,与路径中的目录名匹配不符合要求
好比
"which bin"的结果是空白,"/bin/ps"不是合法结果
whereis命令:在标准的Linux下的几个目录中查找文件相关联的源代码,帮助文档,二进制文件
经常使用用法:whereis filename
含义:基于"/var/lib/mlocate/mlocate.db"数据库,在标准的Linux下的几个目录中查找filename相关联的源代码,帮助文档,二进制文件
好比"whereis man",匹配到的帮助文档为"/usr/share/man/man7/man.7.gz /usr/share/man/man1/man.1.gz",匹配到的二进制文件为"/usr/bin/man /usr/bin/X11/man /usr/local/man /usr/share/man"
好比"whereis kernel",匹配到的源代码"/usr/src/linux-headers-3.16.0-30/kernel /usr/src/linux-headers-3.16.0-30-generic/kernel"
备注:
1)因为是在标准的几个目录中查找,于是扩展性不强
2)经过总体匹配,而不是部分匹配
"whereis ma"不能匹配到"/usr/bin/man"
3)匹配文件名,而不是匹配路径中的目录名
"whereis bin"不能匹配到"/bin/ps"
locate命令:基于“/var/lib/mlocate/mlocate.db”这个数据库查找文件
经常使用用法:locate [-i] PATTERN
含义:
1)查找包含"PATTERN"的文件路径
2)整个查找过程基于"/var/lib/mlocate/mlocate.db"这个数据库
3)系统天天更新一次"/var/lib/mlocate/mlocate.db"数据库
4)能够经过"updatedb"命令手动更新"/var/lib/mlocate/mlocate.db"数据库
file命令:打印推测获得的文件类型
经常使用用法:file -i filename
含义:
打印filename指代的文件的类型和编码格式,没有命令可以确切知道某个文件的编码格式,只能是推测,所以获得的最终文件编码格式不必定是正确的
-i选项:以“mime type”形式打印文件类型和编码格式
stat命令:打印文件信息
经常使用用法:stat 文件路径
含义:打印文件的一些详细信息
好比如今有一个"readme"文件,执行"stat readme"命令,可得如图1所示结果。有一个"Desktop"目录,执行"stat Desktop"命令,可得
[root@huanqiu ~]# stat web.xml
File: `web.xml'
Size: 2438 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 2764173 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2016-09-08 17:25:51.994707928 +0800
Modify: 2016-09-08 17:25:48.595682668 +0800
Change: 2016-09-08 17:25:48.595682668 +0800
[root@huanqiu ~]# stat sudoers/
File: `sudoers/'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd00h/64768d Inode: 2817544 Links: 2
Access: (0700/drwx------) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2016-10-20 15:05:06.551702069 +0800
Modify: 2016-01-21 18:35:44.286016733 +0800
Change: 2016-01-21 18:35:44.286016733 +0800
输出信息中属性的解释以下:
File:文件名称
Size:文件的大小,这个大小是文件的使用大小(关于文件的“使用大小”和“占用大小”可见《Ext文件系统中,文件的“占用大小”和“使用大小”》)。注意,若是是目录文件,该属性值并无累加统计该目录文件下的子文件的使用大小
Blocks:这个Blocks不是指"inode/block"体系中的block数量。其实指的是某种容量单元的数量。不过能够经过公式“Blocks*单个该种容量单元所含字节数/一个block节点所含字节数”换算获得须要的block节点数量,其中单个该种容量单元所含字节数,可经过"stat --format=%B readme"得到。假如单个该种容量单元的含有字节数为512B,一个block节点含有字节数为4096B,如今Blocks=8,那么block节点数量=1。注意,这个属性极易混淆
IO Block:optimal I/O transfer size hint
"regular file":该值表示文件类型
Device:设备号
Inode:Inode节点号
Links:文件的硬连接计数
Access:文件读取执行权限相关信息
Uid:文件所属用户的信息
Gid:文件所属组的信息
Access:atime
Modify:mtime
Change:ctime
Birth:文件建立时间,通常状况下不存在该属性值
basename命令:去除路径前缀和后缀
经常使用用法:basename NAME [SUFFIX]
含义:
给定一个文件名路径,除去前导的目录名,若是指定了SUFFIX,那么也除去SUFFIX指定的后缀,把最终结果打印出来
好比
basename include/stdio.h .h
除去前导的目录名"include/",获得stdio.h
指定SUFFIX=.h,那么除去.h后缀,最后获得stdio
打印stdio
dirname命令:获取路径的目录部分
经常使用用法:dirname NAME
含义:
给定一个文件名路径,除去最后一部分名称内容,接着除去冗余的后导"/",打印最终结果;
若是文件名路径中不包含"/",那么最后打印"."
--------------------------------------------------------------------------------------------------
扩展小提示:
截取目录的方法,有如下两种:
1)dirname命令:用于取给定路径的目录部分。这个命令不多直接在shell命令行中使用,通常把它用在shell脚本中,用于取得脚本文件所在目录,
而后将当前目录切换过去。
其实就是取所给路径的倒数第二级及其以前的路径部分,以下:
[root@jenkins-server Shell]# dirname main/protected/xqsjmob/themes/tpl2/common/page_statistics.tpl
main/protected/xqsjmob/themes/tpl2/common
[root@jenkins-server Shell]# dirname /usr/local/tomcat7/webapps/jenkins/scripts/Shell
/usr/local/tomcat7/webapps/jenkins/scripts
[root@jenkins-server Shell]# dirname FF_Online.sh #取的结果既是当前路径目录下
.
2)能够用${pathname%/*}截取掉pathname后面的文件部分。
下面比较下这两种方法的效果:即dirname取的是倒数第二级及其以上级的路径,而${pathname%/*}取的是"删除最后一个/符号后的路径部分"
[root@jenkins-server Shell]# pathname=/usr/bin/sort; echo $(dirname $pathname) ${pathname%/*}
/usr/bin /usr/bin
You have new mail in /var/spool/mail/root
[root@jenkins-server Shell]# pathname=/usr/bin/sort/; echo $(dirname $pathname) ${pathname%/*}
/usr/bin /usr/bin/sort
[root@jenkins-server Shell]# pathname=/usr/; echo $(dirname $pathname) ${pathname%/*}
/ /usr
[root@jenkins-server Shell]# pathname=/usr; echo $(dirname $pathname) ${pathname%/*}
/
du命令:查看文件大小
1、经常使用用法
du -sh [--apparent-size] 文件路径(文件能够是目录,也能够是通常文件)
2、含义与选项
2.一、含义
当文件为通常文件时,估算该通常文件的大小;当文件为目录时,估算"该目录自身的大小+目录下全部子文件(递归进行)的大小"。
2.二、选项表示的意思
"-s":当du命令的操做对象是一个目录时,不打印该目录下子文件的大小统计状况,只打印目录整体的大小统计状况
"-h":以人类可读形式展现文件大小
"--apparent-size":当不加该选项时,"文件大小"是指文件的"占用大小";当加了该选项后,"文件大小"是指文件的"使用大小"。
3、实验
如今有一个"test1"目录,其下有一个"test2"目录,"test2"目录下有一个"test3"目录,在"test3"目录下有一个"test4.txt"文件,以下所示:
[root@redis-new01 ~]# ll -d test1
drwxr-xr-x 3 root root 4096 Oct 27 21:17 test1
[root@redis-new01 ~]# ls test1/
test2
[root@redis-new01 ~]# ls test1/test2/
test3
[root@redis-new01 ~]# ls test1/test2/test3/
test4.txt
"test1"目录对应1个block节点(大小为4096B),"test2"目录也对应1个block节点(大小为4096B),"test3"目录也对应1个block节点(大小为4096B),
"test4.txt"文件也对应1个block节点(大小为4096B),而"test4.txt"这个通常文件对应的block节点中实际使用的空间大小为12B。
1)以下命令
[root@redis-new01 ~]# du -h test1
8.0K test1/test2/test3
12K test1/test2
16K test1
这是由于:
16K=test1自身的4K+test2自身的4K+test3自身的4K+test4.txt的4K。
2)以下命令
[root@redis-new01 ~]# du -sh test1
16K test1
这是由于:
16K=test1自身的4K+test2自身的4K+test3自身的4K+test4.txt的4K,而且只显示最终的test1目录的整体大小。
3)以下命令
[root@redis-new01 ~]# du -sh --apparent-size test1
13K test1
这是由于:
根据右侧值向上取整获得13K=12K+12B=test1自身的4K+test2自身的4K+test3自身的4K+test4.txt的12B,而且只显示最终的test1目录的整体大小。
sed文本操做命令使用
sed是一个很好的文件处理工具,自己是一个管道命令,主要是以行为单位进行处理,能够将数据行进行替换、删除、新增、选取等特定工做。
sed命令行格式为:
sed [-nefri] ‘command’ 输入文本
经常使用选项:
-n∶使用安静(silent)模式。在通常 sed 的用法中,全部来自 STDIN的资料通常都会被列出到萤幕上。但若是加上 -n 参数后,则只有通过sed 特殊处理的那一行(或者动做)才会被列出来。
-e∶直接在指令列模式上进行 sed 的动做编辑;
-f∶直接将 sed 的动做写在一个档案内, -f filename 则能够执行 filename 内的sed 动做;
-r∶sed 的动做支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i∶直接修改读取的档案内容,而不是由萤幕输出。kevin.txt
经常使用命令:
a ∶新增, a 的后面能够接字串,而这些字串会在新的一行出现(目前的下一行)~
c ∶取代, c 的后面能够接字串,这些字串能够取代 n1,n2 之间的行!
d ∶删除,由于是删除啊,因此 d 后面一般不接任何咚咚;
i ∶插入, i 的后面能够接字串,而这些字串会在新的一行出现(目前的上一行);
p ∶列印,亦即将某个选择的资料印出。一般 p 会与参数 sed -n 一块儿运做~
s ∶取代,能够直接进行取代的工做哩!一般这个 s 的动做能够搭配正规表示法!例如 1,20s/old/new/g 就是啦!
替换一行中的某部分。s后面的替换符号可使用/,#,_三种符号
格式:sed 's/要替换的字符串/新的字符串/g' (要替换的字符串能够用正则表达式)
[root@kevin ~]# sed -n '/ruby/p' kevin.txt | sed 's/ruby/bird/g' #替换ruby为bird
[root@kevin ~]# sed -n '/ruby/p' kevin.txt | sed 's#ruby#bird#g' #替换ruby为bird
[root@kevin ~]# sed -n '/ruby/p' kevin.txt | sed 's_ruby_bird_g' #替换ruby为bird
定址
定址用于决定对哪些行进行编辑。地址的形式能够是数字、正则表达式、或两者的结合。
若是没有指定地址,sed将处理输入文件的全部行。
地址是一个数字,则表示行号;是"$"符号,则表示最后一行。例如:
[root@kevin ~]# sed -n '3p' datafile
只打印第三行
只显示指定行范围的文件内容,例如只查看文件的第100行到第200行
[root@kevin ~]# sed -n '100,200p' mysql_slow_query.log
地址是逗号分隔的,那么须要处理的地址是这两行之间的范围(包括这两行在内)。范围能够用数字、正则表达式、或两者的组合表示。
[root@kevin ~]# sed '2,5d' datafile
删除第二到第五行
[root@kevin ~]# sed '/My/,/You/d' datafile
删除包含"My"的行到包含"You"的行之间的行
[root@kevin ~]# sed '/My/,10d' datafile
删除包含"My"的行到第十行的内容
示例说明
kevin.txt删除某行
[root@kevin ~]# sed '1d' kevin.txtkevin.txt #删除第一行
[root@kevin ~]# sed '$d' kevin.txtkevin.txt #删除最后一行
[root@kevin ~]# sed '1,2d' kevin.txt #删除第一行到第二行
[root@kevin ~]# sed '2,$d' kevin.txt #删除第二行到最后一行
显示某行
[root@kevin ~]# sed -n '1p' kevin.txt #显示第一行
[root@kevin ~]# sed -n '$p' kevin.txt #显示最后一行
[root@kevin ~]# sed -n '1,2p' kevin.txt #显示第一行到第二行
[root@kevin ~]# sed -n '2,$p' kevin.txt #显示第二行到最后一行
使用模式进行查询
[root@kevin ~]# sed -n '/ruby/p' kevin.txt #查询包括关键字ruby所在全部行
[root@kevin ~]# sed -n '/\$/p' kevin.txt #查询包括关键字$所在全部行,使用反斜线\屏蔽特殊含义
增长一行或多行字符串
[root@kevin ~]# cat kevin.txt
kevin.txtHello!
kevin.txtruby is me,welcome to my blog.
kevin.txtend
[root@kevin ~]# sed '1a drink tea' kevin.txt #第一行后增长字符串"drink tea"
kevin.txtHello!
kevin.txtdrink tea
kevin.txtruby is me,welcome to my blog.
kevin.txtend
[root@kevin ~]# sed '1,3a drink tea' kevin.txt #第一行到第三行后增长字符串"drink tea"
kevin.txtHello!
kevin.txtdrink tea
kevin.txtruby is me,welcome to my blog.
kevin.txtdrink tea
kevin.txtend
kevin.txtdrink tea
[root@kevin ~]# sed '1a drink tea\nor coffee' kevin.txt #第一行后增长多行,使用换行符\n
kevin.txtHello!
kevin.txtdrink tea
kevin.txtor coffee
kevin.txtruby is me,welcome to my blog.
kevin.txtend
代替一行或多行
[root@kevin ~]# sed '1c Hi' kevin.txt#第一行代替为Hi
kevin.txtHi
kevin.txtruby is me,welcome to my blog.
kevin.txtend
[root@kevin ~]# sed '1,2c Hi' kevin.txtkevin.txt#第一行到第二行代替为Hi
kevin.txtHi
kevin.txtend
替换一行中的某部分
格式:sed 's/要替换的字符串/新的字符串/g' (要替换的字符串能够用正则表达式)
[root@kevin ~]# sed -n '/ruby/p' kevin.txt | sed 's/ruby/bird/g' #替换ruby为bird
[root@kevin ~]# sed -n '/ruby/p' kevin.txt | sed 's/ruby//g' #删除ruby
kevin.txt插入
[root@kevin ~]# sed -i '$a bye' kevin.txt #在文件kevin.txt中最后一行直接输入"bye"
[root@kevin ~]# cat kevin.txt
kevin.txtHello!
kevin.txtruby is me,welcome to my blog.
kevin.txtend
kevin.txtbye
替换:
-e是编辑命令,用于sed执行多个编辑任务的状况下。在下一行开始编辑前,全部的编辑动做将应用到模式缓冲区中的行上。
[root@kevin ~]# sed -e '1,10d' -e 's/My/Your/g' datafile
选项-e用于进行多重编辑。
第一重编辑删除第1-3行。
第二重编辑将出现的全部My替换为Your。
由于是逐行进行这两项编辑(即这两个命令都在模式空间的当前行上执行),因此编辑命令的顺序会影响结果。
替换两个或多个空格为一个空格
[root@kevin ~]# sed 's/[ ][ ]*/ /g' file_name
替换两个或多个空格为分隔符:
[root@kevin ~]# sed 's/[ ][ ]*/:/g' file_name
若是空格与tkevin.txt共存时用下面的命令进行替换
替换成空格
[root@kevin ~]# sed 's/[[:space:]][[:space:]]*/ /g' filename
替换成分隔符:
[root@kevin ~]# sed 's/[[:space:]][[:space:]]*/:/g' filename
=======================================
sed命令的调用:
在命令行键入命令;将sed命令插入脚本文件,而后调用sed;将sed命令插入脚本文件,并使sed脚本可执行
sed [option] sed命令 输入文件 在命令行使用sed命令,实际命令要加单引号
sed [option] -f sed脚本文件 输入文件 使用sed脚本文件
sed脚本文件 [option] 输入文件 第一行具备sed命令解释器的sed脚本文件
option以下:
n 不打印; sed不写编辑行到标准输出,缺省为打印全部行(编辑和未编辑),p命令能够用来打印编辑行
c 下一命令是编辑命令,使用多项编辑时加入此选项
f 若是正在调用sed脚本文件,使用此选项,此选项通知sed一个脚本文件支持所用的sed命令,如
# sed -f myscript.sed input_file 这里myscript.sed即为支持sed命令的文件
使用重定向文件便可保存sed的输出
使用sed在文本中定位文本的方式:
x x为一行号,好比1
x,y 表示行号范围从x到y,如2,5表示从第2行到第5行
/pattern/ 查询包含模式的行,如/disk/或/[a-z]/
/pattern/pattern/ 查询包含两个模式的行,如/disk/disks/
/pattern/,x 在给定行号上查询包含模式的行,如/disk/,3
x,/pattern/ 经过行号和模式查询匹配行,如 3,/disk/
x,y! 查询不包含指定行号x和y的行
基本sed编辑命令:
p 打印匹配行 c/ 用新文本替换定位文本
= 显示文件行号 s 使用替换模式替换相应模式
a/ 在定位行号后附加新文本信息 r 从另外一个文本中读文本
i/ 在定位行号后插入新文本信息 w 写文本到一个文件
d 删除定位行 q 第一个模式匹配完成后退出或当即退出
l 显示与八进制ASCII代码等价的控制字符 y 传送字符
n 从另外一个文本中读文本下一行,并附加在下一行 {} 在定位行执行的命令组
g 将模式2粘贴到/pattern n/
基本sed编程举例:
使用p(rint)显示行: sed -n '2p' temp.txt 只显示第2行,使用选项n
打印范围: sed -n '1,3p' temp.txt 打印第1行到第3行
打印模式: sed -n '/movie/'p temp.txt 打印含movie的行
使用模式和行号查询: sed -n '3,/movie/'p temp.txt 只在第3行查找movie并打印
显示整个文件: sed -n '1,$'p temp.txt $为最后一行
任意字符: sed -n '/.*ing/'p temp.txt 注意是.*ing,而不是*ing
打印行号: sed -e '/music/=' temp.txt
附加文本:(建立sed脚本文件)chmod u+x script.sed,运行时./script.sed temp.txt
#!/bin/sed -f
/name1/ a/ #a/表示此处换行添加文本
HERE ADD NEW LINE. #添加的文本内容
插入文本: /name1/ a/ 改为 4 i/ 4表示行号,i插入
修改文本: /name1/ a/ 改为 /name1/ c/ 将修改整行,c修改
删除文本: sed '1d' temp.txt 或者 sed '1,4d' temp.txt
替换文本: sed 's/source/OKSTR/' temp.txt 将source替换成OKSTR
sed 's//$//g' temp.txt 将文本中全部的$符号所有删除
sed 's/source/OKSTR/w temp2.txt' temp.txt 将替换后的记录写入文件temp2.txt
替换修改字符串: sed 's/source/"ADD BEFORE" &/p' temp.txt
结果将在source字符串前面加上"ADD BEFORE",这里的&表示找到的source字符并保存
sed结果写入到文件: sed '1,2 w temp2.txt' temp.txt
sed '/name/ w temp2.txt' temp.txt
从文件中读文本: sed '/name/r temp2.txt' temp.txt
在每列最后加文本: sed 's/[0-9]*/& Pass/g' temp.txt
从shell向sed传值: echo $NAME | sed "s/go/$REP/g" 注意须要使用双引号
快速一行命令:
's//.$//g' 删除以句点结尾行
'-e /abcd/d' 删除包含abcd的行
's/[][][]*/[]/g' 删除一个以上空格,用一个空格代替
's/^[][]*//g' 删除行首空格
's//.[][]*/[]/g' 删除句号后跟两个或更多的空格,用一个空格代替
'/^$/d' 删除空行
's/^.//g' 删除第一个字符,区别 's//.//g'删除全部的句点
's/COL/(.../)//g' 删除紧跟COL的后三个字母
's/^////g' 删除路径中第一个/
=================================================
1)使用句点匹配单字符
句点“.”能够匹配任意单字符。“.”能够匹配字符串头,也能够是中间任意字符。假定正在过滤一个文本文件,对于一个有1 0个字符的脚本集,要求前4个字符以后为X C,匹配操做以下:. . . .X C. . . .
2)在行首以^匹配字符串或字符序列
^只容许在一行的开始匹配字符或单词。在行首第4个字符为1,匹配操做表示为:^ . . . 1
3)在行尾以$匹配字符串或字符
能够说$与^正相反,它在行尾匹配字符串或字符, $符号放在匹配单词后。若是在行尾匹配单词j e t 0 1,操做以下:j e t 0 1 $ 若是只返回包含一个字符的行,操做以下:^ . $
4)使用*匹配字符串中的单字符或其重复序列
使用此特殊字符匹配任意字符或字符串的重复屡次表达式。
5)使用/屏蔽一个特殊字符的含义 有
时须要查找一些字符或字符串,而它们包含了系统指定为特殊字符的一个字符。若是要在正则表达式中匹配以* . p a s结尾的全部文件,可作以下操做:/ * / . p a s
6)使用[]匹配一个范围或集合
使用[ ]匹配特定字符串或字符串集,能够用逗号将括弧内要匹配的不一样字符串分开,但并不强制要求这样作(一些系统提倡在复杂的表达式中使用逗号),
这样作能够增 加模式的可读性。使用“ -”表示一个字符串范围,代表字符串范围从“ -”左边字符开始,到“ -”右边字符结束。假定要匹配任意一个数字,
可使用:[ 0 1 2 3 4 5 6 7 8 9 ] 要匹配任意字母,则使用:[ A - Z a - z ]代表从A - Z、a - z的字母范围。
7)使用/{/}匹配模式结果出现的次数
使用*可匹配全部匹配结果任意次,但若是只要指定次数,就应使用/ { / },此模式有三种形式,即:
pattern/{n/} 匹配模式出现n次。
pattern/{n,/} 匹配模式出现最少n次。
pattern/{n,m} 匹配模式出现n到m次之间,n , m为0 - 2 5 5中任意整数。
匹配字母A出现两次,并以B结尾,操做以下:A / { 2 / } B匹配值为A A B 匹配A至少4次,使用:A / { 4 , / } B
======================
替换单引号为空,能够这样写:
sed 's/'"'"'//g'
sed 's/'\''//g'
sed s/\'//g
=====================
在文件的第一行前面插入一行abc
sed -i '1i\abc' urfile
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@kevin ~]# 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个账号
[root@kevin ~]# last -n 5 | awk '{print $1}'
root
root
root
dmtsai
root
awk工做流程是这样的:
读入有'\n'换行符分割的一条记录,而后将记录按指定的域分隔符划分域,填充域,$0则表示全部域,$1表示第一个域,$n表示第n个域。
默认域分隔符是"空白键" 或 "[tab]键",因此$1表示登陆用户,$3表示登陆用户ip,以此类推。
若是只是显示/etc/passwd的帐户
[root@kevin ~]# cat /etc/passwd |awk -F ':' '{print $1}'
root
daemon
bin
sys
这种是awk+action的示例,每行都会执行action{print $1}。
-F指定域分隔符为':'。
若是只是显示/etc/passwd的帐户和帐户对应的shell,而帐户与shell之间以tab键分割
[root@kevin ~]# 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"。
[root@kevin ~]# 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关键字的全部行
[root@kevin ~]# 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
[root@kevin ~]# 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:文件名,每行的行号,每行的列数,对应的完整行内容:
[root@kevin ~]# 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,可让代码更加简洁,易读
[root@kevin ~]# awk -F ':' '{printf("filename:%10s,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的帐户人数
[root@kevin ~]# 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:
[root@kevin ~]# 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
统计某个文件夹下的文件占用的字节数
[root@kevin ~]# ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'
[end]size is 8657198
若是以M为单位显示:
[root@kevin ~]# 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大小的文件(通常都是文件夹):
[root@kevin ~]# 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"}'
[start]size is 0
[end]size is 0.0610514 M
循环语句
awk中的循环语句一样借鉴于C语言,支持while、do/while、for、break、continue,这些关键字的语义和C语言中的语义彻底相同。
数组
由于awk中数组的下标能够是数字和字母,数组的下标一般被称为关键字(key)。值和关键字都存储在内部的一张针对key/value应用hash的表格里。
因为hash不是顺序存储,所以在显示数组内容时会发现,它们并非按照你预料的顺序显示出来的。数组和变量同样,都是在使用时自动建立的,awk
也一样会自动判断其存储的是数字仍是字符串。通常而言,awk中的数组用来从记录中收集信息,能够用于计算总和、统计单词以及跟踪模板被匹配的次数等。
显示/etc/passwd的帐户
[root@kevin ~]# 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循环遍历数组
grep命令:从文件中查找匹配模式的行
1.做用
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是全部用户。
2.格式
grep [options]
3.主要参数
[options]主要参数:
-c:只输出匹配行的计数。
-I:不区分大 小写(只适用于单字符)。
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及 行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的全部行。
pattern正则表达式主要参数:
\: 忽略正则表达式中特殊字符的原有含义。
^:匹配正则表达式的开始行。
$: 匹配正则表达式的结束行。
\<:从匹配正则表达 式的行开始。
\>:到匹配正则表达式的行结束。
[ ]:单个字符,如[A]即A符合要求 。
[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
。:全部的单个字符。
* :有字符,长度能够为0。
grep -v 过滤
grep -c 打印关键字符所在的行数
grep -An 打印关键字符所在的行的后n行内容
grep -Bn 打印关键字符所在的行的前n行内容
grep -Cn 打印关键字符所在的行的先后各n行内容
cat filename |grep "abc"
fgrep -R "abc" ./*
4.grep命令使用简单实例
[root@kevin ~]# grep ‘test’ d*
显示全部以d开头的文件中包含 test的行。
[root@kevin ~]# grep ‘test’ aa bb cc
显示在aa,bb,cc文件中匹配test的行。
[root@kevin ~]# grep ‘[a-z]\{5\}’ aa
显示全部包含每一个字符串至少有5个连续小写字符的字符串的行。
[root@kevin ~]# grep ‘w\(es\)t.*\1′ aa
若是west被匹配,则es就被存储到内存中,并标记为1,而后搜索任意个字符(.*),这些字符后面紧跟着 另一个es(\1),找到就显示该行。
若是用egrep或grep -E,就不用”\”号进行转义,直接写成’w(es)t.*\1′就能够了。
5.grep命令使用复杂实例
假设您正在’/usr/src/Linux/Doc’目录下搜索带字符 串’magic’的文件:
[root@kevin ~]# grep magic /usr/src/Linux/Doc/*
sysrq.txt:* How do I enable the magic SysRQ key?
sysrq.txt:* How do I use the magic SysRQ key?
其中文件’sysrp.txt’包含该字符串,讨论的是 SysRQ 的功能。
默认状况下,’grep’只搜索当前目录。若是 此目录下有许多子目录,’grep’会以以下形式列出:
grep: sound: Is a directory
这可能会使’grep’ 的输出难于阅读。这里有两种解决的办法:
明确要求搜索子目录:grep -r
或忽略子目录:grep -d skip
若是有不少 输出时,您能够经过管道将其转到’less’上阅读:
[root@kevin ~]# grep magic /usr/src/Linux/Documentation/* | less
这样,您就能够更方便地阅读。
有一点要注意,
您必需提供一个文件过滤方式(搜索所有文件的话用 *)。若是您忘了,’grep’会一直等着,直到该程序被中断。
若是您遇到了这样的状况,按 <CTRL c> ,而后再试。
下面还有一些有意思的命令行参数:
grep -i pattern files :不区分大小写地搜索。默认状况区分大小写,
grep -l pattern files :只列出匹配的文件名,
grep -L pattern files :列出不匹配的文件名,
grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配’magic’,而不是’magical’),
grep -C number pattern files :匹配的上下文分别显示[number]行,
grep pattern1 | pattern2 files :显示匹配 pattern1 或 pattern2 的行,
grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。
grep -n pattern files 便可显示行号信息
grep -c pattern files 便可查找总行数
这里还有些用于搜索的特殊符号:
\< 和 \> 分别标注单词的开始与结尾。
例如:
grep man * 会匹配 ‘Batman’、’manic’、’man’等,
grep ‘\<man’ * 匹配’manic’和’man’,但不是’Batman’,
grep ‘\<man\>’ 只匹配’man’,而不是’Batman’或’manic’等其余的字符串。
‘^’:指匹配的字符串在行首,
‘$’:指匹配的字符串在行 尾,
==============grep、fgrep、egrep的区别=================
者都是搜索工具,但功能上有区别。
1)首先,grep支持的是标准正则表达式。
2)fgrep,不支持正则表达式,只用于匹配固定字符串。
grep把模式当作正则表达式看,fgrep把模式当作固定字符串看,因此后者要比前者速度快,固然同时后者的搜索功能要弱于前者。
3)egrep:为grep 的扩充版本, 改良了许多传统 grep 不能或不便的操做. 好比:
- grep 之下不支持 ? 与 + 这两种 modifier, 但 egrep 则可。
- grep 不支持 a|b 或 (abc|xyz) 这类"或一"比对, 但 egrep 则可。
- grep 在处理 {n,m} 时, 需用 \{ 与 \} 处理, 但 egrep 则不需。
===========================================
示例说明
[root@kevin ~]# ps -ef | grep in.telnetd
root 19955 181 0 13:43:53 ? 0:00 in.telnetd
[root@kevin ~]# more size.txt size文件的内容
b124230
b034325
a081016
m7187998
m7282064
a022021
a061048
m9324822
b103303
a013386
b044525
m8987131
B081016
M45678
B103303
BADc2345
[root@kevin ~]# more size.txt | grep '[a-b]' 范围 ;如[A-Z]即A,B,C一直到Z都符合要求
b124230
b034325
a081016
a022021
a061048
b103303
a013386
b044525
[root@kevin ~]# more size.txt | grep '[a-b]'*
b124230
b034325
a081016
m7187998
m7282064
a022021
a061048
m9324822
b103303
a013386
b044525
m8987131
B081016
M45678
B103303
BADc2345
[root@kevin ~]# more size.txt | grep 'b' #单个字符;如[b] 即b符合要求
b124230
b034325
b103303
b044525
[root@kevin ~]# more size.txt | grep '[bB]' #b或者B
b124230
b034325
b103303
b044525
B081016
B103303
BADc2345
[root@kevin ~]# grep 'root' /etc/group
root::0:root
bin::2:root,bin,daemon
sys::3:root,bin,sys,adm
adm::4:root,adm,daemon
uucp::5:root,uucp
mail::6:root
tty::7:root,tty,adm
lp::8:root,lp,adm
nuucp::9:root,nuucp
daemon::12:root,daemon
[root@kevin ~]# grep '^root' /etc/group #匹配正则表达式的开始行
root::0:root
[root@kevin ~]# grep 'uucp' /etc/group
uucp::5:root,uucp
nuucp::9:root,nuucp
[root@kevin ~]# grep '\<uucp' /etc/group
uucp::5:root,uucp
[root@kevin ~]# grep 'root[root@kevin ~]#' /etc/group #匹配正则表达式的结束行
root::0:root
mail::6:root
[root@kevin ~]# more size.txt | grep -i 'b1..*3' #忽略大小写
b124230
b103303
B103303
[root@kevin ~]# more size.txt | grep -iv 'b1..*3' #查找不包含匹配项的行
b034325
a081016
m7187998
m7282064
a022021
a061048
m9324822
a013386
b044525
m8987131
B081016
M45678
BADc2345
[root@kevin ~]# more size.txt | grep -in 'b1..*3'
1:b124230
9:b103303
15:B103303
[root@kevin ~]# grep '[root@kevin ~]#' /etc/init.d/nfs.server | wc -l
128
[root@kevin ~]# grep '\[root@kevin ~]#' /etc/init.d/nfs.server | wc –l #忽略正则表达式中特殊字符的原有含义
15
[root@kevin ~]# grep '\$' /etc/init.d/nfs.server
case "$1" in
>/tmp/sharetab.$$
[ "x$fstype" != xnfs ] &&
echo "$path\t$res\t$fstype\t$opts\t$desc"
>>/tmp/sharetab.$$
/usr/bin/touch -r /etc/dfs/sharetab /tmp/sharetab.$$
/usr/bin/mv -f /tmp/sharetab.$$ /etc/dfs/sharetab
if [ -f /etc/dfs/dfstab ] && /usr/bin/egrep -v '^[ ]*(#|$)'
if [ $startnfsd -eq 0 -a -f /etc/rmmount.conf ] &&
if [ $startnfsd -ne 0 ]; then
elif [ ! -n "$_INIT_RUN_LEVEL" ]; then
while [ $wtime -gt 0 ]; do
wtime=`expr $wtime - 1`
if [ $wtime -eq 0 ]; then
echo "Usage: $0 { start | stop }"
[root@kevin ~]# more size.txt
the test file
their are files
The end
[root@kevin ~]# grep 'the' size.txt
the test file
their are files
[root@kevin ~]# grep '\<the' size.txt
the test file
their are files
[root@kevin ~]# grep 'the\>' size.txt
the test file
[root@kevin ~]# grep '\<the\>' size.txt
the test file
[root@kevin ~]# grep '\<[Tt]he\>' size.txt
the test file
多个文件查询
[root@kevin ~]# grep "sort" *.txt #见文件名的匹配
行匹配:输出匹配行的计数
[root@kevin ~]# grep -c "48" kevin.txt #输出文档中含有48字符的行数
显示匹配行和行数
[root@kevin ~]# grep -n "48" kevin.txt #显示全部匹配48的行和行号
显示非匹配的行
[root@kevin ~]# grep -vn "48" kevin.txt #输出全部不包含48的行
显示非匹配的行
[root@kevin ~]# grep -vn "48" kevin.txt #输出全部不包含48的行
大小写敏感
[root@kevin ~]# grep -i "ab" kevin.txt #输出全部含有ab或Ab的字符串的行
====================================
正则表达式的应用 (注意:最好把正则表达式用单引号括起来)
[root@kevin ~]# grep '[239].' kevin.txt #输出全部含有以2,3或9开头的,而且是两个数字的行
不匹配测试
[root@kevin ~]# grep '^[^48]' kevin.txt #不匹配行首是48的行
使用扩展模式匹配
[root@kevin ~]# grep -E '219|216' kevin.txt
使用类名
可使用国际模式匹配的类名:
[[:upper:]] [A-Z]
[[:lower:]] [a-z]
[[:digit:]] [0-9]
[[:alnum:]] [0-9a-zA-Z]
[[:space:]] 空格或tab
[[:alpha:]] [a-zA-Z]
[root@kevin ~]# grep '5[[:upper:]][[:upper:]]' kevin.txt #查询以5开头以两个大写字母结尾的行
cat、more、less、tail、head命令
cat 是一个文本文件(查看)和(链接)工具,一般与more搭配使用,与more不一样的是cat能够合并文件。查看一个文件的内容,用cat比较简单,
就是cat后面直接接文件名。
cat [选项] [文件]...
选项
-A, --show-all 等价于 -vET
-b, --number-nonblank 对非空输出行编号
-e 等价于 -vE
-E, --show-ends 在每行结束处显示 $
-n, --number 对输出的全部行编号
-s, --squeeze-blank 不输出多行空行
-t 与 -vT 等价
-T, --show-tabs 将跳格字符显示为 ^I
-u (被忽略)
-v, --show-nonprinting 使用 ^ 和 M- 引用,除了 LFD 和 TAB 以外
--help 显示此帮助信息并离开
cat 查看文件内容实例:
[root@kevin ~]# cat /etc/profile //查看/etc/目录下的profile文件内容;
[root@kevin ~]# cat -b /etc/fstab //查看/etc/目录下的profile内容,而且对非空白行进行编号,行号从1开始;
[root@kevin ~]# cat -n /etc/profile //对/etc目录中的profile的全部的行(包括空白行)进行编号输出显示;
[root@kevin ~]# cat -E /etc/profile //查看/etc/下的profile内容,而且在每行的结尾处附加$符号;
cat 加参数-n 和nl工具差很少,文件内容输出的同时,都会在每行前面加上行号;
[root@kevin ~]# cat -n /etc/profile
[root@kevin ~]# nl /etc/profile
cat 能够同时显示多个文件的内容,好比咱们能够在一个cat命令上同时显示两个文件的内容;
[root@kevin ~]# cat /etc/fstab /etc/profile
cat 对于内容极大的文件来讲,能够经过管道|传送到more 工具,而后一页一页的查看;
[root@kevin ~]# cat /etc/fstab /etc/profile | more
cat 的建立、链接文件功能实例:
cat 有建立文件的功能,建立文件后,要以EOF或STOP结束;
[root@kevin ~]# cat > kevin.txt<< EOF
> 我来测试 cat 建立文件,而且为文件输入内容;
> 北京是个好地方;
> EOF
[root@kevin ~]# cat kevin.txt
我来测试 cat 建立文件,而且为文件输入内容;
北京是个好地方;
cat 还有向已存在的文件追加内容的功能;
[root@kevin ~]# cat grace.txt
I am BeiNanNanBei From grace.Org .
我正在为cat命令写文档
[root@kevin ~]# cat >> grace.txt << EOF
> 我来测试cat向文档追加内容的功能;
> OK?
> OK~
> 北京你好
> EOF
[root@kevin ~]# cat grace.txt //查看文件内容,看是否追回成功。
I am BeiNanNanBei From grace.Org .
我正在为cat命令写文档
我来测试cat向文档追加内容的功能;
OK?
OK~
北京你好
cat 链接多个文件的内容而且输出到一个新文件中;
假设咱们有sir01.txt、sir02.tx和sir03.txt ,而且内容以下;
[root@kevin ~]# cat sir01.txt
123456
i am testing
[root@kevin ~]# cat sir02.txt
56789
BeiNan Tested
[root@kevin ~]# cat sir03.txt
09876
grace.org testing
我想经过cat 把sir01.txt、sir02.txt及sir03.txt 三个文件链接在一块儿(也就是说把这三个文件的内容都接在一块儿)并输出到一个新的文件sir04.txt 中。
注意:
其原理是把三个文件的内容链接起来,而后建立sir04.txt文件,而且把几个文件的内容同时写入sir04.txt中。特别值得一提的是,若是您输入到一个已经
存在的sir04.txt 文件,会把sir04.txt内容清空。
[root@kevin ~]# cat sir01.txt sir02.txt sir03.txt > sir04.txt
[root@kevin ~]# more sir04.txt
123456
i am testing
56789
BeiNan Tested
09876
grace.org testing
cat 把一个或多个已存在的文件内容,追加到一个已存在的文件中
[root@kevin ~]# cat sir00.txt
grace.org forever
[root@kevin ~]# cat sir01.txt sir02.txt sir03.txt >> sir00.txt
[root@kevin ~]# cat sir00.txt
grace.org forever
123456
i am testing
56789
BeiNan Tested
09876
grace.org testing
======================================================
more 是咱们最经常使用的工具之一,最经常使用的就是显示输出的内容,而后根据窗口的大小进行分页显示,而后还能提示文件的百分比;
参数以下:
+num 从第num行开始显示;
-num 定义屏幕大小,为num行;
+/pattern 从pattern 前两行开始显示;
-c 从顶部清屏而后显示;
-d 提示Press space to continue, 'q' to quit.(按空格键继续,按q键退出),禁用响铃功能;
-l 忽略Ctrl+l (换页)字符;
-p 经过清除窗口而不是滚屏来对文件进行换页。和-c参数有点类似;
-s 把连续的多个空行显示为一行;
-u 把文件内容中的下划线去掉退出more的动做指令是q
more 的参数应用举例:
[root@kevin ~]# more -dc /etc/profile //显示提示,并从终端或控制台顶部显示;
[root@kevin ~]# more +4 /etc/profile //从profile的第4行开始显示;
[root@kevin ~]# more -4 /etc/profile //每屏显示4行;
[root@kevin ~]# more +/MAIL /etc/profile //从profile中的第一个MAIL单词的前两行开始显示;
more 的动做指令:
咱们查看一个内容较大的文件时,要用到more的动做指令,好比ctrl+f(或空格键) 是向下显示一屏,ctrl+b是返回上一屏; Enter键能够向下滚动显示n行,要经过定,默认为1行;
咱们只说几个经常使用的; 本身尝试一下就知道了;
Enter 向下n行,须要定义,默认为1行;
Ctrl+f 向下滚动一屏;
空格键 向下滚动一屏;
Ctrl+b 返回上一屏;
= 输出当前行的行号;
:f 输出文件名和当前行的行号;
v 调用vi编辑器;
! 命令 调用Shell,并执行命令;
q 退出more当咱们查看某一文件时,想调用vi来编辑它,不要忘记了v动做指令,这是比较方便的;
其它命令经过管道和more结合的运用例子:
好比咱们列一个目录下的文件,因为内容太多,咱们应该学会用more来分页显示。这得和管道 | 结合起来,好比:
[root@kevin ~]# ls -l /etc |more
=======================================================
less 查看文件内容 工具
less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大;您是初学者,我建议您用less。
因为less的内容太多,咱们把最经常使用的介绍一下;
经常使用参数
-c 从顶部(从上到下)刷新屏幕,并显示文件内容。而不是经过底部滚动完成刷新;
-f 强制打开文件,二进制文件显示时,不提示警告;
-i 搜索时忽略大小写;除非搜索串中包含大写字母;
-I 搜索时忽略大小写,除非搜索串中包含小写字母;
-m 显示读取文件的百分比;
-M 显法读取文件的百分比、行号及总行数;
-N 在每行前输出行号;
-p pattern 搜索pattern;好比在/etc/profile搜索单词MAIL,就用 less -p MAIL /etc/profile
-s 把连续多个空白行做为一个空白行显示;
-Q 在终端下不响铃;
好比:咱们在显示/etc/profile的内容时,让其显示行号;
[root@kevin ~]# less -N /etc/profile
less的动做命令:
进入less后,咱们得学几个动做,这样更方便 咱们查阅文件内容;最应该记住的命令就是q,这个能让less终止查看文件退出;
动做:
回车键 向下移动一行;
y 向上移动一行;
空格键 向下滚动一屏;
b 向上滚动一屏;
d 向下滚动半屏;
h less的帮助;
u 向上洋动半屏;
w 能够指定显示哪行开始显示,是从指定数字的下一行显示;好比指定的是6,那就从第7行显示;
g 跳到第一行;
G 跳到最后一行;
p n% 跳到n%,好比 10%,也就是说比整个文件内容的10%处开始显示;
/pattern 搜索pattern ,好比 /MAIL表示在文件中搜索MAIL单词;
v 调用vi编辑器;
q 退出less
!command 调用SHELL,能够运行命令;好比!ls 显示当前列当前目录下的全部文件;
就less的动做来讲,内容太多了,用的时候查一查man less是最好的。在这里就不举例子了;
==========================================================
head 工具,显示文件内容的前几行
head 是显示一个文件的内容的前多少行;
用法比较简单;
head -n 行数值 文件名;
好比咱们显示/etc/profile的前10行内容,应该是:
[root@kevin ~]# head -n 10 /etc/profile
=========================================================
tail 工具,显示文件内容的最后几行
tail 是显示一个文件的内容的最后多少行;
用法比较简单;
tail -n 行数值 文件名;
好比咱们显示/etc/profile的最后5行内容,应该是:
[root@kevin ~]# tail -n 5 /etc/profile
tail -f /var/log/syslog 显示文件 syslog 的后十行内容并在文件内容增长后,且自动显示新增的文件内容。
cut命令:打印每行特定范围内内容express
cut是一个选取命令,就是将一段数据通过分析,取出咱们想要的。通常来讲,选取信息一般是针对“行”来进行分析的,并非整篇信息分析的。
其语法格式为:
cut [-bn] [file] 或 cut [-c] [file] 或 cut [-df] [file]
使用说明
cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
若是不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。
主要参数
-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f :与-d一块儿使用,指定显示哪一个区域。
-n :取消分割多字节字符。仅和 -b 标志一块儿使用。若是字符的最后一个字节落在由 -b 标志的 List 参数指示的<br />范围以内,该字符将被写出;不然,该字符将被排除。
cut通常以什么为依据呢? 也就是说,我怎么告诉cut我想定位到的剪切内容呢?
cut命令主要是接受三个定位方法:
第一,字节(bytes),用选项-b
第二,字符(characters),用选项-c
第三,域(fields),用选项-f
=========================================
cut在取列内容的时候和awk相识
awk -F"" '{print $n}' 以-F后的引号内的内容为列的分隔符,打印第n行
cut -d"" -fn 以-d后的引号内的内容为列的分隔符,打印第n行
好比打印a.txt文件中以空格为列的分隔符,打印第5行
awk -F" " '{print $5}' a.txt 当以空格为分隔符的时候,-F" " 能够省去
cut -d" " -f5 a.txt
=========================================
以“字节”定位
举个例子吧,当你执行ps命令时,会输出相似以下的内容:
[root@kevin ~]# who
rocrocket :0 2009-01-08 11:07
rocrocket pts/0 2009-01-08 11:23 (:0.0)
rocrocket pts/1 2009-01-08 14:15 (:0.0)
若是咱们想提取每一行的第3个字节,就这样:
[root@kevin ~]# who|cut -b 3
c
c
c
若是“字节”定位中,我想提取第3,第四、第5和第8个字节,怎么办?
-b支持形如3-5的写法,并且多个定位之间用逗号隔开就成了。看看例子吧:
[root@kevin ~]# who|cut -b 3-5,8
croe
croe
croe
但有一点要注意,cut命令若是使用了-b选项,那么执行此命令时,cut会先把-b后面全部的定位进行从小到大排序,而后再提取。
可不能颠倒定位的顺序哦。这个例子就能够说明这个问题:
[root@kevin ~]# who|cut -b 8,3-5
croe
croe
croe
还有哪些相似“3-5”这样的小技巧,列举一下吧!
[root@kevin ~]# who
rocrocket :0 2009-01-08 11:07
rocrocket pts/0 2009-01-08 11:23 (:0.0)
rocrocket pts/1 2009-01-08 14:15 (:0.0)
[root@kevin ~]# who|cut -b -3
roc
roc
roc
[root@kevin ~]# who|cut -b 3-
crocket :0 2009-01-08 11:07
crocket pts/0 2009-01-08 11:23 (:0.0)
crocket pts/1 2009-01-08 14:15 (:0.0)
-3表示从第一个字节到第三个字节,而3-表示从第三个字节到行尾。若是你细心,你能够看到这两种状况下,都包括了第三个字节“c”。
若是我执行who|cut -b -3,3-,你以为会如何呢?答案是输出整行,不会出现连续两个重叠的c的。看:
[root@kevin ~]# who|cut -b -3,3-
rocrocket :0 2009-01-08 11:07
rocrocket pts/0 2009-01-08 11:23 (:0.0)
rocrocket pts/1 2009-01-08 14:15 (:0.0)
给个以字符为定位标志的最简单的例子吧!
下面例子你似曾相识,提取第3,第4,第5和第8个字符:
[root@kevin ~]# who|cut -c 3-5,8
croe
croe
croe
不过,看着怎么和-b没有什么区别啊?莫非-b和-c做用同样? 其实否则,看似相同,只是由于这个例子举的很差,who输出的都是单字节字符,
因此用-b和-c没有区别,若是你提取中文,区别就看出来了,来,看看中文提取的状况:
[root@kevin ~]# cat cut_ch.txt
星期一
星期二
星期三
星期四
[root@kevin ~]# cut -b 3 cut_ch.txt
�
�
�
�
[root@kevin ~]# cut -c 3 cut_ch.txt
一
二
三
四
看到了吧,用-c则会以字符为单位,输出正常;而-b只会傻傻的以字节(8位二进制位)来计算,输出就是乱码。
既然提到了这个知识点,就再补充一句,若是你学有余力,就提升一下。
当遇到多字节字符时,可使用-n选项,-n用于告诉cut不要将多字节字符拆开。例子以下:
[root@kevin ~]# cat cut_ch.txt |cut -b 2
�
�
�
�
[root@kevin ~]# cat cut_ch.txt |cut -nb 2
[root@kevin ~]# cat cut_ch.txt |cut -nb 1,2,3
星
星
星
星
域是怎么回事呢?解释解释:)
为何会有“域”的提取呢,由于刚才提到的-b和-c只能在固定格式的文档中提取信息,而对于非固定格式的信息则一筹莫展。这时候“域”就派上用场了。
若是你观察过/etc/passwd文件,你会发现,它并不像who的输出信息那样具备固定格式,而是比较零散的排放。可是,冒号在这个文件的每一行中都
起到了很是重要的做用,冒号用来隔开每个项。
cut命令提供了这样的提取方式,具体的说就是设置“间隔符”,再设置“提取第几个域”,就OK了!
以/etc/passwd的前五行内容为例:
[root@kevin ~]# cat /etc/passwd|head -n 5
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
[root@kevin ~]# cat /etc/passwd|head -n 5|cut -d : -f 1
root
bin
daemon
adm
lp
用-d来设置间隔符为冒号,而后用-f来设置我要取的是第一个域,再按回车,全部的用户名就都列出来了!
固然,在设定-f时,也可使用例如3-5或者4-相似的格式:
[root@kevin ~]# cat /etc/passwd|head -n 5|cut -d : -f 1,3-5
root:0:0:root
bin:1:1:bin
daemon:2:2:daemon
adm:3:4:adm
lp:4:7:lp
[root@kevin ~]# cat /etc/passwd|head -n 5|cut -d : -f 1,3-5,7
root:0:0:root:/bin/bash
bin:1:1:bin:/sbin/nologin
daemon:2:2:daemon:/sbin/nologin
adm:3:4:adm:/sbin/nologin
lp:4:7:lp:/sbin/nologin
[root@kevin ~]# cat /etc/passwd|head -n 5|cut -d : -f -2
root:x
bin:x
daemon:x
adm:x
lp:x
若是遇到空格和制表符时,怎么分辨呢?我以为有点乱,怎么办?
有时候制表符确实很难辨认,有一个方法能够看出一段空格究竟是由若干个空格组成的仍是由一个制表符组成的。
[root@kevin ~]# cat tab_space.txt
this is tab finish.
this is several space finish.
[root@kevin ~]# sed -n l tab_space.txt
this is tab\tfinish.$
this is several space finish.$
若是是制表符(TAB),那么会显示为\t符号,若是是空格,就会原样显示。
经过此方法便可以判断制表符和空格了。
注意,上面sed -n后面的字符是L的小写字母哦,不要看错。
我应该在cut -d中用什么符号来设定制表符或空格呢?
其实cut的-d选项的默认间隔符就是制表符,因此当你就是要使用制表符的时候,彻底就能够省略-d选项,而直接用-f来取域就能够了。
若是你设定一个空格为间隔符,那么就这样:
[root@kevin ~]# cat tab_space.txt |cut -d ' ' -f 1
this
this
注意,两个单引号之间可确实要有一个空格哦,不能偷懒。
并且,你只能在-d后面设置一个空格,可不准设置多个空格,由于cut只容许间隔符是一个字符。
[root@kevin ~]# cat tab_space.txt |cut -d ' ' -f 1
cut: the delimiter must be a single character
Try `cut --help' for more information.
cut有哪些缺陷和不足?
猜出来了吧?对,就是在处理多空格时。
若是文件里面的某些域是由若干个空格来间隔的,那么用cut就有点麻烦了,由于cut只擅长处理“以一个字符间隔”的文本内容。
tr命令:删除,去重,替换文本内容ap
能够把tr看做为一个简化的sed工具,tr表示为:translate。tr命令主要用于实现如下两个功能
替换操做的字符串转换。
删除操做的字符串转换,能够很容易的删除一些控制字符或者是空行。
tr命令可以实现的功能,都可以用sed命令来实现。但就具体的替换功能来讲,tr用起来更容易,也比较简单。
一,命令格式
tr [option] ["string1"] ["string2"] < file
经常使用的选项有:
默认选项。就是没有任何选项的时候,tr默认为替换操做,就是将string1在文件中出现的字符替换为string2中的字符,这里要注意的是替换关系。
-c选项,用string1中字符的补集替换string1,这里的字符集为ASCII。
-d选项,删除文件中全部在string1中出现的字符。
-s选项,删除文件中重复而且在string1中出现的字符,只保留一个。
-c选项在使用时,只是将string1替换为如今的补集
[root@kevin ~]# echo "hello world,root,2012" | tr -c "0-9" "*"
*****************2012*
能够看出,咱们使用0-9,添加-c选项后,会把0-9替换为其补集,这时补集天然不包含0-9,而包含不少其它的字符,接下来就把全部的其它字符都替换成*号,
但不包含数字。
若是只须要替换数字的话:
[root@kevin ~]# echo "hello world,root,2012" | tr "0-9" "*"
hello world,root,****
二,字符串的取值范围
指定string或string2的内容时,只能使用单字符或字符串范围或列表。
[a-z] a-z内的字符组成的字符串。
[A-Z] A-Z内的字符组成的字符串。
[0-9] 数字串。
\octal 一个三位的八进制数,对应有效的ASCII字符。
[O*n] 表示字符O重复出现指定次数n。所以[O*2]匹配OO的字符串。
三,控制字符的不一样表达方式
速记符 含义 八进制方式
\a Ctrl-G 铃声\007
\b Ctrl-H 退格符\010
\f Ctrl-L 走行换页\014
\n Ctrl-J 新行\012
\r Ctrl-M 回车\015
\t Ctrl-I tab键\011
\v Ctrl-X \030 注意这些控制字符,若是想在linux下输入,如咱们可能须要输入^M这种字符,只需ctrl+V+M同时按下便可。
四,字符替换
这是tr的默认操做,先看下面的命令和输出
[root@kevin ~]# echo "hello world" | tr "a-z" "A-Z"
HELLO WORLD
[root@kevin ~]# echo "hello world" | tr "a-l" "A-Z"
HELLo worLD
[root@kevin ~]# echo "hello world" | tr "a-z" "A-H"
HEHHH HHHHD
第一行输出就是将小写换成大写。
第二行输出将小写中的a-l分别换成A-L,而将小写中的l之后的字符都不替换。
第三行输出将小写中的a-h换成A-H,而h之后的字符都换成H,由于后者的替换空间没有前面的字符空间大,因此就重复后面的H,
至关于后面的字符是A-HHH......HHHHH。
若是咱们想要进行大小写转换,能够按下面的输入:
tr "a-z" "A-Z" < inputfile
五,去除重复字符
这个时候,所用的选项是-s选项,如:
[root@kevin ~]# echo "hello world,root" | tr -s "ao"
hello world,rot
[root@kevin ~]# echo "hello world,root" | tr -s "lo"
helo world,rot
[root@kevin ~]# echo "hello world,root" | tr -s "a-z"
helo world,rot
[root@kevin ~]# echo "hello world,root" | tr -s "0-9"
hello world,root
第一行表示将输入字符串中的包含在"ao"字符集中的重复字符去掉,只留一个。由于"hello world,root",只有o知足条件,因此将root变成rot,把中间的两个o变成一个。
第二行将hello和root两个字符都压缩了。
第三行表示将a-z中的除复字符都去掉。
第三行表示将字符串中的重复的且重复字符在0-9字符集中的字符去掉,这里没有。
若是咱们想要去掉空行,能够这样操做:
tr -s "\n" < inputfile 或者 tr -s "\012" <inputfile // 这两个是同样的。
就是将重复的换行符去掉,只留一个。
六,删除字符
-d选项和-s选项相似,只不过-d选项会删除全部出现的字符。
[root@kevin ~]# echo "hello world,root" | tr -d "a-h"
llo worl,root
[root@kevin ~]# echo "hello world,root,2012" | tr -d "a-z"
,,2012
[root@kevin ~]# echo "hello world,root,2012" | tr -d "0-9"
sort/uniq/cut/wc命令
sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出。若是 File 参数指定多个文件,那么 sort 命令将这些文件链接起来,并看成一个文件进行排序。
sort语法
sort [-fbMnrtuk] [file or stdin]
选项与参数:
-f :忽略大小写的差别,例如 A 与 a 视为编码相同;
-b :忽略最前面的空格符部分;
-M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
-n :使用『纯数字』进行排序(默认是以文字型态来排序的);
-r :反向排序;
-u :就是 uniq ,相同的数据中,仅出现一行表明;
-t :分隔符,默认是用 [tab] 键来分隔;
-k :以那个区间 (field) 来进行排序的意思
对/etc/passwd 的帐号进行排序
[root@kevin ~]# 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@kevin ~]# 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
默认是以字符串来排序的,若是想要使用数字排序:
[root@kevin ~]# 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
默认是升序排序,若是要倒序排序,以下
[root@kevin ~]# 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个字符进行正向排序,再基于第一个域进行反向排序。
[root@kevin ~]# 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的第七个域进行排序,而后去重:
[root@kevin ~]# 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常常和sort合用。也就是说,为了使uniq起做用,全部的重复行必须是相邻的。
uniq语法
uniq [-icu]
选项与参数:
-i :忽略大小写字符的不一样;
-c :进行计数
-u :只显示惟一的行
[root@kevin ~]# cat testfile
hello
world
friend
hello
world
hello
直接删除未经排序的文件,将会发现没有任何行被删除
[root@kevin ~]# uniq testfile
hello
world
friend
hello
world
hello
排序文件,默认是去重
[root@kevin ~]# cat words | sort |uniq
friend
hello
world
排序以后删除了重复行,同时在行首位置输出该行重复的次数
[root@kevin ~]# sort testfile | uniq -c
1 friend
3 hello
2 world
仅显示存在重复的行,并在行首显示该行重复的次数
[root@kevin ~]# sort testfile | uniq -dc
3 hello
2 world
仅显示不重复的行
[root@kevin ~]# sort testfile | uniq -u
friend
===============================================
sort|uniq 排序去重
sort|uniq -c|srot -rn 排序去重,并降序
sort|uniq -c 打印重复的行数
sort|uniq -d 打印交集部分
sort|uniq -u 打印交集之外的部分
==============================================
[root@kevin ~]# cat a.txt
sdfsdf
123
123
1234
123
dasdfsd
sdfsdf
asfd34234
[root@kevin ~]# cat a.txt |sort|uniq
123
1234
asfd34234
dasdfsd
sdfsdf
[root@kevin ~]# cat a.txt |sort|uniq -c
3 123
1 1234
1 asfd34234
1 dasdfsd
2 sdfsdf
[root@kevin ~]# cat a.txt |sort|uniq -d
123
sdfsdf
[root@kevin ~]# cat a.txt |sort|uniq -u
1234
asfd34234
dasdfsd
[root@kevin ~]# cat a.txt
sdfsdf
123
123
1234
123
dasdfsd
sdfsdf
asfd34234
[root@kevin ~]# cat b.txt
sdf
123
err
2345
123
gggg
[root@kevin ~]# cat a.txt b.txt |sort|uniq
123
1234
2345
asfd34234
dasdfsd
err
gggg
sdf
sdfsdf
[root@kevin ~]# cat a.txt b.txt |sort|uniq -c
5 123
1 1234
1 2345
1 asfd34234
1 dasdfsd
1 err
1 gggg
1 sdf
2 sdfsdf
[root@kevin ~]# cat a.txt b.txt |sort|uniq -d
123
sdfsdf
[root@kevin ~]# cat a.txt b.txt |sort|uniq -u
1234
2345
asfd34234
dasdfsd
err
gggg
sdf
=======================================================
cut命令能够从一个文本文件或者文本流中提取文本列。
cut语法
cut -d'分隔字符' -f fields <==用于有特定分隔字符
cut -c 字符区间 <==用于排列整齐的信息
选项与参数:
-d :后面接分隔字符。与 -f 一块儿使用;
-f :依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思;
-c :以字符 (characters) 的单位取出固定字符区间;
PATH 变量以下
[root@kevin ~]# echo $PATH
/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games
# 1 | 2 | 3 | 4 | 5 | 6 | 7
将 PATH 变量取出,我要找出第五个路径。
[root@kevin ~]# echo $PATH | cut -d ':' -f 5
/usr/local/bin
将 PATH 变量取出,我要找出第三和第五个路径。
[root@kevin ~]# echo $PATH | cut -d ':' -f 3,5
/sbin:/usr/local/bin
将 PATH 变量取出,我要找出第三到最后一个路径。
[root@kevin ~]# echo $PATH | cut -d ':' -f 3-
/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games
将PATH 变量取出,我要找出第一到第三个路径。
[root@kevin ~]# echo $PATH | cut -d ':' -f 1-3
/bin:/usr/bin:/sbin:
将PATH 变量取出,我要找出第一到第三,还有第五个路径。
[root@kevin ~]# echo $PATH | cut -d ':' -f 1-3,5
/bin:/usr/bin:/sbin:/usr/local/bin
实用例子:只显示/etc/passwd的用户和shell
[root@kevin ~]# cat /etc/passwd | cut -d ':' -f 1,7
root:/bin/bash
daemon:/bin/sh
bin:/bin/sh
====================================================
wc
统计文件里面有多少单词,多少行,多少字符。
wc语法
[root@kevin ~]# wc [-lwm]
选项与参数:
-l :仅列出行;
-w :仅列出多少字(英文单字);
-m :多少字符;
默认使用wc统计/etc/passwd
[root@kevin ~]# wc /etc/passwd
40 45 1719 /etc/passwd
40是行数,45是单词数,1719是字节数
wc的命令比较简单使用,每一个参数使用以下:
[root@kevin ~]# wc -l /etc/passwd #统计行数,在对记录数时,很经常使用
40 /etc/passwd #表示系统有40个帐户
[root@kevin ~]# wc -w /etc/passwd #统计单词出现次数
45 /etc/passwd
[root@kevin ~]# wc -m /etc/passwd #统计文件的字节数
1719
split命令:切分文件
split命令用于将一个文件分割成数个。
该指令将大文件分割成较小的文件,在默认状况下将按照每1000行切割成一个小文件。
语法
split [--help][--version][-<行数>][-b <字节>][-C <字节>][-l <行数>][要切割的文件][输出文件名]
参数说明:
-<行数> : 指定每多少行切成一个小文件.如split -3 a.txt
-b<字节> : 指定每多少字节切成一个小文件
-l, --lines=NUMBER:对file进行切分,每一个文件有NUMBER行。
--help : 在线帮助
--version : 显示版本信息
-C<字节> : 与参数"-b"类似,可是在切 割时将尽可能维持每行的完整性
[输出文件名] : 设置切割后文件的前置文件名, split会自动在前置文件名后再加上编号
示例1:
使用指令split将文件a.txt每3行切割成一个文件,输入以下命令:
注意:是按照a.txt文件中的行数进行分割的,每3行切分到一个文件中,切割成多个以"x"开头的小文件。直至全部行数被分完。
[root@kevin ~]# cat a.txt
sdfsdf
123123123
sdfasdf2r345345
kljljkl
sjkdfjsdofopf
sadfsd2343
123123
asdf4555
66666
888888
[root@kevin ~]# split -3 a.txt
[root@kevin ~]# ls
anaconda-ks.cfg a.txt xaa xab xac xad
[root@kevin ~]# cat xaa
sdfsdf
123123123
sdfasdf2r345345
[root@kevin ~]# cat xab
kljljkl
sjkdfjsdofopf
sadfsd2343
[root@kevin ~]# cat xac
123123
asdf4555
66666
[root@kevin ~]# cat xad
888888
示例2:
有个文件要处理,由于很大,因此想把它切成若干份,每份N行,以便并行处理。
参数说明:
-b, --bytes=SIZE:对file进行切分,每一个小文件大小为SIZE。能够指定单位b,k,m。
-l, --lines=NUMBER:对file进行切分,每一个文件有NUMBER行。
prefix:分割后产生的文件名前缀。
示例:
假设要切分的文件为test.2012-08-16_17,大小1.2M,12081行。
1)
[root@kevin ~]# split -l 5000 test.2012-08-16_17
生成xaa,xab,xac三个文件。
[root@kevin ~]# wc -l #看到三个文件行数以下:
5000 xaa
5000 xab
2081 xac
12081 总计
2)
[root@kevin ~]# split -b 600k test.2012-08-16_17
生成xaa,xab两个文件
[root@kevin ~]# ls -lh #看到两个文件大小以下:
600K xaa
554K xab
3)
[root@kevin ~]# split -b 500k test.2012-08-16_17 example
获得三个文件,文件名的前缀都是example
[root@kevin ~]# ls -lh #看到文件信息以下:
500K exampleaa
500K exampleab
154K exampleac
示例3:
将一个大文件分红若干个小文件方法
例如将一个BLM.txt文件分红前缀为 BLM_ 的1000个小文件,后缀为系数形式,且后缀为4位数字形式
[root@kevin ~]# wc -l BLM.txt #读出 BLM.txt 文件一共有多少行
[root@kevin ~]# split -l 2482 ../BLM/BLM.txt -d -a 4 BLM_
将文件 BLM.txt 分红若干个小文件,每一个文件2482行(-l 2482),文件前缀为BLM_ ,系数不是字母而是数字(-d),后缀系数为四位数(-a 4)
=====================================================
Linux下文件分割能够经过split命令来实现,能够指定按行数分割和安大小分割两种模式。Linux下文件合并能够经过cat命令来实现,很是简单。
在Linux下用split进行文件分割:
模式一:指定分割后文件行数
对与txt文本文件,能够经过指定分割后文件的行数来进行文件分割。
命令:split -l 300 large_file.txt new_file_prefix
模式二:指定分割后文件大小
split -b 10m server.log waynelog
对二进制文件咱们一样也能够按文件大小来分隔。
在Linux下用cat进行文件合并:
命令:cat small_files* > large_file
将a.txt的内容输入到b.txt的末尾
cat a.txt >> b.txt
comm命令:对于两个已排序文件,逐行比对
1、经常使用用法
comm FILE1 FILE2
2、含义与选项
2.一、含义
对于两个已排序的文件,逐行比对。
打印结果有3列:第1列,只属于“FILE1”的行;第2列,只属于“FILE2”的行;第3列,既属于“FILE1”,又属于“FILE2”的行。
2.二、选项表示的意思
“FILE1,FILE2”:指代已排序文件“FILE1”和“FILE2”
3、其余
3.一、“LC_COLLATE”等环境变量
因为涉及到两个字符串的比较等,故而程序实现中使用“LC_COLLATE”等环境变量,最终结果受到“LC_COLLATE”等环境变量的控制。
3.二、排序策略
comm命令实现设定的排序策略是“按照字典序排序”。两个已排序文件使用的排序策略组合共有3种状况。
3.2.一、状况1
一个排序文件按照字典序排序,另一个排序文件按照非字典序(其余排序策略)排序。显而易见,在这种状况下,comm命令的执行结果会比较奇怪。
[root@localhost ~]# cat a.txt
001
02
3
10
[root@localhost ~]# cat b.txt
001
02
5
06
007
10
即已按照“数值大小”排序,执行“逐行比对”过程,咱们的预期结果是:“3”只属于“c.txt”,“5,06,007”只属于“d.txt”,“001,02,10”共属于两个文件。
如今执行comm a.txt b.txt命令,获得如图1所示结果,不能达到预期。
[root@localhost ~]# comm a.txt b.txt
001
02
3
comm: file 1 is not in sorted order
10
5
comm: file 2 is not in sorted order
06
007
10
执行comm --nocheck-order a.txt b.txt命令,获得如图2所示结果,也不能达到预期。
[root@localhost ~]# comm --nocheck-order a.txt b.txt
001
02
3
10
5
06
007
10
两个文件都已按照字典序排序,这符合comm命令实现的设定,comm命令的执行结果可以达到预期。执行下述命令,获得如图3所示结果,结果符合预期。
[root@localhost ~]# sort a.txt > aa.txt
[root@localhost ~]# sort b.txt > bb.txt
[root@localhost ~]# comm aa.txt bb.txt
001
007
02
06
10
3
5
[root@localhost ~]# cat aa.txt
001
02
10
3
[root@localhost ~]# cat bb.txt
001
007
02
06
10
5
join命令:根据两行中具备相同值的两个字段,将该两行内容拼接成一行打印输出
1、经常使用用法
join [-t CHAR] [-i] [--header] [-1 FIELD] [-2 FIELD] [-e STR] FILE1 FILE2
2、含义与选项
2.一、含义
存在两个已排序文件,假如文件1中的某条记录的某个字段值(默认是第一个字段,从1开始计数)与文件2中的某条记录的某个字段值
(默认是第一个字段,从1开始计数)一致,那么在最终打印结果中,将这两条记录拼接成一条记录。
2.二、选项表示的意思
“-t CHAR”:以“CHAR”字符做为记录内字段间的分隔符,默认的分隔符是“空格符”
“-i”:两个字段值比较时,忽略大小写
“–header”:两个文件的第一行做为说明行,不参与比较
“-1 FIELD”:FILE1中以第“FIELD”个字段做为比较字段
“-2 FIELD”:FILE2中以第“FIELD”个字段做为比较字段
“-e STR”:在最终的拼接记录中,若是某个字段的值为空,那么以“STR”替换
“FILE1”:文件1
“FILE2”:文件2
示例一
有文件“a.txt”和“b.txt”,内容分别以下:
[root@localhost ~]# cat a.txt
a 1
b 2
[root@localhost ~]# cat b.txt
a 3
b 4
执行如下命令,获得以下结果:
[root@localhost ~]# join a.txt b.txt
a 1 3
b 2 4
示例二
有文件“a.txt”和“b.txt”,内容分别以下:
[root@localhost ~]# cat a.txt
a;1
b;2
[root@localhost ~]# cat b.txt
a;3
b;4
执行如下命令,获得以下结果:
[root@localhost ~]# join -t ';' a.txt b.txt
a;1;3
b;2;4
示例三
有文件“a.txt”和“b.txt”,内容分别以下:
[root@localhost ~]# cat a.txt
A 1
b 2
[root@localhost ~]# cat b.txt
a 3
b 4
执行如下命令,获得以下结果:
[root@localhost ~]# join -i a.txt b.txt
A 1 3
b 2 4
示例四
有文件“a.txt”和“b.txt”,内容分别以下:
[root@localhost ~]# cat a.txt
Col1 Col2
a 1
b 2
[root@localhost ~]# cat b.txt
Col3 Col4
a 3
b 4
执行如下命令,获得以下结果:
[root@localhost ~]# join --header a.txt b.txt
Col1 Col2 Col4
a 1 3
b 2 4
示例五
有文件“a.txt”和“b.txt”,内容分别以下:
[root@localhost ~]# cat a.txt
a 1 f
b 2 g
[root@localhost ~]# cat b.txt
f 3 5
g 4 6
执行如下命令,获得以下结果:
[root@localhost ~]# join -1 3 -2 1 a.txt b.txt
f a 1 3 5
g b 2 4 6
示例六
有文件“a.txt”和“b.txt”,内容分别以下:
[root@localhost ~]# cat a.txt
a
b 2
[root@localhost ~]# cat b.txt
a 3
b 4
执行如下命令,获得以下结果:
[root@localhost ~]# join -e "hello world" a.txt b.txt
a hello world 3
b 2 4
4、其余
4.一、“LC_COLLATE”等环境变量
因为涉及到两个字符串的比较等,故而程序实现中使用“LC_COLLATE”等环境变量,最终结果受到“LC_COLLATE”等环境变量的控制。
4.二、排序策略
跟“comm”命令同样,join命令实现设定的排序策略是“按照字典序排序”。于是,两个文件“已排序”应该是按照字典序已排序,不然执行join命令获得的结果颇有可能不能符合预期。