linux学习笔记

************2017-07-21************************************************************

ls
-l 长格式显示
-d 显示目录
-a 显示隐藏文件
-p 目录后加\
-F 文件加加 */=>@|
touch 创建文件
mkdir 目录1 目录2 可一次创建多个目录
echo 打印输出内容
echo context > file 将Context输入到文件中,这是一个>是覆盖,两个>是追加
cat 查看文件
cat >>file<<开始符context结束符 将context 内容追加到file中
cat >>file 回车后输入内容,最后回车加Ctrl+C结束输入,追加内容到file
cp -a file1 file2 将文件1自制到文件2
-a = -pdr p保持属性 d 是目录 r是递归
rm file 删除文件
-rf f强制删除文件 r是递归删除
rmdir forld 删除空目录

查看命令的说明
man command
command --help

mkdir -p /data/c -p递归创建文件或目录

LANG=en 临时调整字符集(出现断码时)

复制已存在文件,不提示直接操作
[root@st1 ~]# \cp /tmp/a ./a ----在命令前加\
[root@st1 ~]# /bin/cp /tmp/a ./a ----用命令全路径

Alisa别名
alias
取消别名 unalias command
可在/etc/bashrc 或etc/profile 里设定,永久更新

查看文件路径
which 文件
whereis 文件
find 目录 -type f -name '名字'
-type f查找文件
可用find查找后再删除
find / -type f -name 'a.txt' |xargs rm -rf
find / -type f -mtime +5 |xargs ls -l 查看5天前修改的文件
find / -type f -mtime -5 |xargs ls -l 查看最近5天修改的文件

不显示a中的aaaaaaaaa内容
grep -v aaaaaaaaa a ------v 排除内容,如果想显示则不加参数
test
liyao

[root@st1 ~]# head -2 a -----显示前两行
test
liyao

head 显示文件头部,-行 显示多少行

tail 显示文件尾部的行数
tail -行数

不加参数都默认10行

SEQ -------打印一个序列的数字
格式: seq start 步长 end -----可以不用步长,默认1
[root@louts_test01 ~]# seq -s ' ' 5 -----行显示,以空格分割
1 2 3 4 5
[root@louts_test01 ~]# seq -s '=' 5
1=2=3=4=5
[root@louts_test01 ~]# seq 5 -----列显示
1
2
3
4
5
[root@louts_test01 ~]# seq 1 2 10 -----按步长从小到大
1
3
5
7
9
[root@louts_test01 ~]# seq 1 2 10|tac ---------------------倒序排列
9
7
5
3
1

打印文件和21-30行,两种方法
[root@louts_test01 ~]# sed -n '21,30p' a.txt
21
22
23
24
25
26
27
28
29
30
[root@louts_test01 ~]# awk '{if(NR>20&&NR<31) print $0}' a.txt
21
22
23
24
25
26
27
28
29
30
{if(NR>19&&NR<31) print $0} NR代表行数,&&代表关系与,$0 代表打印所有

-F ':' '{print $1}' -F加符号表示以符号分割,$1表示打印第一列
[root@louts_test01 ~]# awk -F ':' '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
uucp
operator

----------------------------------------
三剑客
1. awk 打印列较多
[root@st1 ~]# awk /[^oldbou]/ a
test
liyao
[root@st1 ~]# awk /oldbou/ a
oldbou
2. sed 取各种内容
[root@st1 ~]# sed -n /oldbo/p a
oldbou
p是打印 n是取消原始输出
[root@st1 ~]# sed /^liy/d a
test
oldbou
d是del,将liy删除并打印输出,可以用正则表示^以什么开头

修改内容
格式:sed -i s#11#1111#g -i是修改 ,S#源内容#新内容#g
root@louts_test01 ~]# sed -i s#11#1111#g a.txt

查到后批量修改文件内容
[root@louts_test01 ~]# find / -type f -name 'loutsx.txt' |xargs sed -i s#111#111---111---111#g


3. grep 核心命令,按行过滤内容
-v 排除显示内容,不加参数显示想看的内容
-i 不区别大小写
-E 同时过虑多个字串中间用|分割
egrep = grep -E

快捷键:
Tab 命令补全
Ctrl+C 终止当前任务或命令
Ctrl+D 退出当前用户环境,相关于exit, logout
Ctrl+a 光标到开头
Ctrl+e 光标到结尾
Ctrl+r 查找历史命令 !165执行第165条历史命令 !字母 执行字母开头的命令

符号:
~ 家目录
- 上次目录
{} 打印序列 echo {1..3}
PATH 环境变量
< 或 <0 标准输入stdin
<< 或 <<0
> 或 1> 标准输出 stdout
>> 或 1>>
2> 或 2>> 标准错误输出 stderr
2>&1或2>& 后面讲解
[root@st1 ~]# datedd > a.txt
-bash: datedd: command not found
[root@st1 ~]# datedd 2> a.txt
[root@st1 ~]# cat a.txt
-bash: datedd: command not found
[root@st1 ~]#

 


************2017-07-27*************************************************

32位和64位的区别:
寻址能力不同/系统配置不同/软件普及不同/运算速度不同/设计目标不同

IDE硬盘为hda
其他硬盘为sda
1-4为主分区或扩展分区,5开始为逻辑分区

分区模式:
一般: boot 100M swap 1.5倍内存 其他为根
DB Server: boot 100M swap 1.5倍内存 / 50-200G data 其他空间

如果内存大于16G,swap一般分配8-16G,正常分区不用LVM,性能太差,一般硬RAID

[root@louts_test01 ~]# cat /etc/redhat-release ------------查看系统版本
CentOS release 6.5 (Final)
[root@louts_test01 ~]# uname -a
Linux louts_test01 2.6.32-696.6.3.el6.x86_64 #1 SMP Wed Jul 12 14:17:22 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[root@louts_test01 ~]# uname -m
x86_64
[root@louts_test01 ~]# uname -r
2.6.32-696.6.3.el6.x86_64

文件比较工具:diff vimdiff
查看当前用户: whoami
su - user 切换用户,中间要加-,否则环境变量无法同步
echo 'passwd' | passwd --stdin user 直接更新用户密码,不用交互式操作

passwd -e  <user-name>   下次登录更改密码,要求复杂密码

rpm -ivh 安装RPM包

最小化原则:
1)安装系统最小化
2)开启程序最小化
3)操作最小化 rm -f a.txt
4)登录最小化:平时用普通用户登录,
5)权限最小化
6)配置参数合理,勿最大化

更新YUM源
[root@louts_test01 dev]# cat /etc/yum.repos.d/CentOS-Base.repo --------------查看YUM更新源
可更改更新源为国内镜像:
1)备份/etc/yum.repos.d/CentOS-Base.repo
2)下载163的更新源:http://mirrors.163.com/.help/CentOS6-Base-163.repo
3)将新下载的更新源重命名为CentOS-Base.repo
4)yum clean all --------------生成缓存
5)yum makecache

安装基本软件:
yum install -y telnet dos2unix

关闭SElinux
[root@st1 ~]# sed -i s#SELINUX=enforcing#SELINUX=disabled#g /etc/selinux/config

[root@st1 ~]# grep disabled /etc/selinux/config
# disabled - No SELinux policy is loaded.
SELINUX=disabled
[root@st1 ~]# getenforce -------------------查看当前的状态,Selinux修改后重启才能生效
Enforcing
[root@st1 ~]# setenforce 0 -------------------可临时更改,即刻生效
[root@st1 ~]# getenforce
Permissive

Linux启动Level---可通过修改Level切换启动模式
[root@st1 ~]# cat /etc/inittab
# Default runlevel. The runlevels used are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:
切换用户模式: init 0 关机模式

查看当前系统运行级别
[root@st1 ~]# runlevel
N 3

查看系统任务
setup
ntsysv
脚本完成

[root@st1 ~]# chkconfig --list | grep 3:on ------------------查看Level3筹备组的启动软件
abrt-ccpp 0:off 1:off 2:off 3:on 4:off 5:on 6:off
abrtd 0:off 1:off 2:off 3:on 4:off 5:on 6:off
acpid 0:off 1:off 2:on 3:on 4:on 5:on 6:off
atd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
auditd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
blk-availability 0:off 1:on 2:on 3:on 4:on 5:on 6:off
cpuspeed 0:off 1:on 2:on 3:on 4:on 5:on 6:off
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
haldaemon 0:off 1:off 2:off 3:on 4:on 5:on 6:off
ip6tables 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@st1 ~]# for i in `chkconfig --list |grep "3:on"|awk "{print $1}"`;do chkconfig $i off;done ------------找到所有开的list名字,并用For进行迭代关闭
[root@st1 ~]# for i in ntpd rdisc;do chkconfig $i on;done ------------------批量开启任务
[root@st1 ~]# chkconfig --list ntpd
ntpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off

另一种方式:找出需要开的,把其他不要的全关掉
for i in `chkconfig --list|grep '3:on'|awk '{print $1}'|grep -vE "sshd|atd"`,do chkconfig $i off;done
chkconfig --list -----------------列出所有的启动
grep '3:on' -----------------显示Level3为ON的
awk '{print $1}' -----------------打印第一列的内容,也就是服务名称
grep -vE "sshd|atd" --------------不显示sshd或atd,-vE可以一次排除多个,中间用|分开

************2017-07-30************************************************************

Linux基本优化:
更改SSH默认端口和登录用户
vi /etc/ssh/sshd_config
Port 2707 更改登录端口
PermitEmptyPasswords yes 禁止空密码登录
UseDNS no 不使用DNS
PermitRootLogin no 禁止root远程登录
#GSSAPIAuthentication no Linux下SSH远程连接服务慢解决方案,后续介绍

切换 root模式:
1. su - root 切换到Root环境,root权限
2. sudo 让普通用户拥有指定的root权限
sudo su -
通过配置文件更改:visudo = vi /etc/sudoers
loutsx ALL=(ALL) /usr/sbin/useradd
用户 所有 可执行的命令,可以有多个,用逗号分开
%组 添加组的用户
loutsx ALL=(ALL) NOPASSWD:ALL ----有root功能,切换时不需要密码
sudo su - 直接切换了,不需密码

[loutsx@st1 ~]$ sudo useradd test01 ------------执行时带sudo useradd test01
[sudo] password for loutsx:
[loutsx@st1 ~]$ tail -1 /etc/passwd
test01:x:501:501::/home/test01:/bin/bash

[loutsx@st1 ~]$ sudo -l ---------------查看sudo的权限
User loutsx may run the following commands on this host:
(ALL) NOPASSWD: ALL

su 和 su - 的区别:
su 不会切环境变量,还是原来的环境变量
su - 会切换到新用户的环境变量
可用env查看

[loutsx@st1 ~]$ echo $PATH ----------------查看系统变量
/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/loutsx/bin
添加环境变量:
全局生效:/etc/profile
用户生效:~/.bash_profile 或~/.bashrc

[loutsx@st1 ~]$ PATH=$PATH:/home/loutsx/aa/ -------------将自定义的目录加到环境变量中,临时生效,重启消失

[root@st1 ~]# echo 'PATH=$PATH:/home/loutsx/aa' >>/etc/profile -------------将命令放到文件中,永久生效,用单引号,这样在文件中显示变量,而不是全部路径
[root@st1 ~]# source /etc/profile ----------------生效

[root@st1 ~]# tail -1 /etc/profile
PATH="$PATH:/home/loutsx/aa"


vi编辑器用法:
行号gg 定位行号
yy copy当前行
p 粘贴
dd 删除一行
set nu -----显示行号
shift+G 文件尾部
gg 文件头


netstat 参数
-lntup l列表 n数字显示 tTCP协议 uUDP协议 p进程名
-an

netstat [address_family_options] [--tcp|-t] [--udp|-u]
[--raw|-w] [--listening|-l] [--all|-a] [--numeric|-n]
[--numeric-hosts][--numeric-ports][--numeric-ports] [--sym-
bolic|-N] [--extend|-e[--extend|-e]] [--timers|-o] [--pro-
gram|-p] [--verbose|-v] [--continuous|-c] [delay]

[root@st1 ~]# netstat -lntup | grep ssh
tcp 0 0 0.0.0.0:2707 0.0.0.0:* LISTEN 1548/sshd
tcp 0 0 :::2707 :::* LISTEN 1548/sshd
[root@st1 ~]# lsof -i -------------查看端口
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dhclient 1294 root 5u IPv4 9931 0t0 UDP *:bootpc
sshd 1548 root 3u IPv4 10591 0t0 TCP *:emcsymapiport (LISTEN)
sshd 1548 root 4u IPv6 10593 0t0 TCP *:emcsymapiport (LISTEN)
sshd 1709 root 3r IPv4 11230 0t0 TCP 192.168.0.101:emcsymapiport->192.168.0.102:63210 (ESTABLISHED)
sshd 1711 loutsx 3u IPv4 11230 0t0 TCP 192.168.0.101:emcsymapiport->192.168.0.102:63210 (ESTABLISHED)
sshd 1934 root 3r IPv4 12137 0t0 TCP 192.168.0.101:emcsymapiport->192.168.0.102:63268 (ESTABLISHED)
sshd 1936 loutsx 3u IPv4 12137 0t0 TCP 192.168.0.101:emcsymapiport->192.168.0.102:63268 (ESTABLISHED)


字符集:和套文件符号及编码
GBK 定长 双字节 不是国际标准,支持系统不少
UTF-8 非定长 1-4字节 广泛支持,MYSQL使用UTF-8

[root@st1 aa]# cat /etc/sysconfig/i18n ------调整字符
#LANG="en_US.UTF-8"
LANG="zh_CN.GB18030"
#SYSFONT="latarcyrheb-sun16"
[root@st1 aa]# echo $LANG ------查看当前字符集
en_US.UTF-8
[root@st1 aa]# source /etc/sysconfig/i18n ------即时生效
[root@st1 aa]# echo $LANG
zh_CN.GB18030

[root@st1 aa]# locale ------查看字符集
LANG=zh_CN.GB18030
LC_CTYPE="zh_CN.GB18030"
LC_NUMERIC="zh_CN.GB18030"
LC_TIME="zh_CN.GB18030"
LC_COLLATE="zh_CN.GB18030"
LC_MONETARY="zh_CN.GB18030"
LC_MESSAGES="zh_CN.GB18030"
LC_PAPER="zh_CN.GB18030"
LC_NAME="zh_CN.GB18030"
LC_ADDRESS="zh_CN.GB18030"
LC_TELEPHONE="zh_CN.GB18030"
LC_MEASUREMENT="zh_CN.GB18030"
LC_IDENTIFICATION="zh_CN.GB18030"
LC_ALL=
[root@st1 aa]# LANG=EN

时间同步 NTP服务,用以下三条命令
/usr/sbin/ntpdate time.nist.gov ----------临时执行
echo '#time sysc by loutsx at 2017-07-30' >>/var/spool/cron/root --------内容注释
echo '*/5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/nunn 2>&1 ' >> /var/spool/cron/root ------------每5分钟同步一次
crontab -l ------------查看任务

[root@st1 aa]# /usr/sbin/ntpdate time.nist.gov ----------临时执行
30 Jul 10:43:10 ntpdate[2113]: step time server 216.229.0.179 offset 12.286812 sec
[root@st1 aa]# echo '#time sysc by loutsx at 2017-07-30' >>/var/spool/cron/root --------内容注释
[root@st1 aa]# echo '*/5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/nunn 2>&1 ' >> /var/spool/cron/root ------------每5分钟同步一次
[root@st1 aa]# crontab -l ------------查看任务
#time sysc by loutsx at 2017-07-30
*/5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/nunn 2>&1




加大服务器文件描述符
[root@st1 aa]# ulimit -n
1024

[root@st1 aa]# ulimit -HSn 65535 -----------临时加大,退出后还行
[root@st1 aa]# ulimit -n
65535

[root@st1 ~]# echo '* - nofile 65535' >>/etc/security/limits.conf ----永久生效,直接写文件
[root@st1 ~]# tail -1 /etc/security/limits.conf
* - nofile 65535

linux基础优化:
1. 调整内核参数
[root@st1 ~]# vi /etc/sysctl.conf
#add by loutsx
net.ipv4.tcp_fin_timeout = 2 连接超时
net.ipv4.tcp_tw_reuse = 1 连接重用
net.ipv4.tcp_tw_recycle = 1 连接快速回收
net.ipv4.tcp_syncookies = 1 SYN队列溢出时可用Cookies处理
net.ipv4.tcp_keepalive_time = 600 连接保持时间,更长并发更少
net.ipv4.ip_local_port_range = 4000 65000
net.ipv4.tcp_max_syn_backlog = 16384 SYN队列的长度,默认1024
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384

#iptable youhua -------如果不开防火墙,可能下面会出错
net.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_tcp_timeout_established = 180
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.ipv4.tcp_max_orphans = 16384

[root@st1 ~]# sysctl -p ---------------------生效

2. 如果装了sendmail,可能会产生许多小文件,导致inodes满载而无法写入文件,可用df -hi查看inodes
[loutsx@st1 ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 20G 1.5G 17G 9% /
tmpfs 930M 0 930M 0% /dev/shm
/dev/sda1 190M 35M 146M 19% /boot
[loutsx@st1 ~]$ df -hi
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 1.3M 57K 1.2M 5% /
tmpfs 233K 1 233K 1% /dev/shm
/dev/sda1 50K 38 50K 1% /boot


3. 隐藏系统版本号
[root@st1 ~]# cat /etc/issue ----------查看显示内容
CentOS release 6.9 (Final)
Kernel \r on an \m

[root@st1 ~]# >/etc/issue
[root@st1 ~]# cat /etc/issue
[root@st1 ~]# cat /dev/null >/etc/issue

4. 锁定关键系统文件
chattr --------------改变文件属性
[root@st1 ~]# chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab ------------------加锁

[root@st1 ~]# rm -f /etc/passwd
rm: 无法删除"/etc/passwd": 不允许的操作
[root@st1 ~]# useradd test
useradd:无法打开 /etc/passwd
[root@st1 ~]# chattr -i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab ------------------解锁

[root@st1 ~]# mv /usr/bin/chattr /usr/bin/mytest -------将关键命令改名

[root@st1 ~]# chattr +i /etc/passwd
[root@st1 ~]# lsattr /etc/passwd -----查看是否加锁,有i表示已加锁
----i--------e- /etc/passwd
[root@st1 ~]#

优化总结:
1.不用root,添加变通用户,通过sudo授权管理
2.更改默认的远程SSH服务端口及禁止root用户远程连接
3.自动定期更新服务器时间
4.配置YUM更新源,从国内更新源下载安装rpm包
5.关闭SElinux及Iptables(如果有WAN,一定要打开,高并发除外)
6.调整文件描述符的数量,进行及文件的打开都会消耗文件描述符
7.定时自动清理/var/spool/clientmquent/目录垃圾文件,防止inodes节点被占满(没有装sendmail不用处理)
8.精简开启自动服务(crond,sshd,netwrk,rsyslog(5.8 syslog)
9.linux内核优化 /etc/sysctl.conf ,执行systcl -p生效
10.更改字符集,支持中文,建议用英文,防止乱码
11.锁定关键系统文件 chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab ,然后将chattr改名
12.清空/etc/issue,去除系统及内核版本及登录显示
更多优化列表:http://oldboy.blog.51cto.com/2561410/988726



************2017-07-30************************************************************
linux系统目录结构知识讲解

Linux命令总结:
mkdir -p 递归创建目录
ls -ld 显示目录或文件 -a 隐藏文件,.开头是隐藏文件 touch .b.txt
cd ~家目录 -上次目录
echo 打印输出(printf 更复杂的打印)
cat -n 显示行号 cat >> a.txt 追加到结尾
cp -a source destnation -a = -dpr 不提示用全路径
tac 反转内容输出 sep 1 5 | tac
vi/vim 编辑器
pwd/mv/rm/vi/alias/which/tree -L 1 层数/man/touch/diff/vimdiff/history/useradd/passwd/whoami/yum/rpm -ivh /chkconfig/uname
head / tail / echo / rmdir / grep / egrep / sed / awk / su - / sudo su - / netstat /lsof -i :port /chattr +i-i / lsattr
head -行数 显示头部行数,默认10行
tail -行数 显示尾部行数,默认10行,-f 监控尾部输出
grep 过滤字符串 -i 忽略大小写 -E 同时过虑多个字串 -v 排除字符串
sed 取行 -n取消标准输出 p打印 d删除
find 查找 -type 按类型 -name 按名称 -mtime 按修改时间
xargs 配合其他命令使用
seq -s ' ' 打印序列 -s 以什么分割

Linux目录结构
逻辑上所有目录只有一个顶点 /(根),所有目录的起点

设备挂载
mount /dev/sdb1 /usr
mount [-lhV]
mount -a [-fFnrsvw] [-t vfstype] [-O optlist]
mount [-fnrsvw] [-o option[,option]...] device|dir
mount [-fnrsvw] [-t vfstype] [-o options] device dir

应用程序 /usr/bin
数据文件/帮助 /share
配置文件 /etc/
启动命令 /etc/init.d/

小结:
1. Linux所有目录结构是一个有层次的倒挂树形结构
2. 根 / 是所有目录的顶点
3. 目录结构和分区没关系,目录可跨不同的分区
4. 所有目录按一定规律组织和命名的

相对路径:当前目录下的路径
绝对路径:从根开始
/ 存放系统相关程序
/bin 常用二进制命令目录,普通用户
/boot Linux内核引导系统程序目录
/dev 设备文件 /dev/null 黑洞文件(cat /dev/null > a.txt 清空文件 相关于 >a.txt)
/etc yum/rpm的配置文件默认路径,服务启动命令。手工编译不在此处
|-- export NFS 配置文件
|-- fstab 开机自动挂载磁盘配置文件
|-- hosts static information about host names
|-- inittab 初始化系统配置文件
|-- issue 内核版本,系统版本
|-- passwd 密码文件
|-- profile 系统初始文件
|-- resolv.conf DNS配置文件
|-- services 网络服务配置文件
|-- syslog.conf 日志配置文件
|-- motd 登录后显示的信息配置
/home 普通用户的家目录
/lib 库文件
/lib64 64位库文件
/lost+found 系统意外故障时产生的临时文件存放目录,用fsck 修改
/mnt 文件系统临时挂载点(文件系统/设备的入口)
/opt 存放第三方厂商开发程序,无用
/proc 内核及进程信息的虚拟文件系统,放磁盘/内在/cpu信息
cat cpuinfo
cat loadavg
cat meminfo
/root
/sbin 系统管理命令目录,超级用户权限,同/usr/sbin/
/tmp 临时文件目录,共用目录,都有权限操作
/usr 用户程序及数据及帮忙文件等目录
/usr/local 存放用户安装的程序,一般编译安装默认路径,yum或rpm不在此目录
/var 可变内容的目录,一般是日志或缓存目录
/var/log/messages 系统日志文件
/var/log/secure 系统安全日志目录

目录层级标准 FHS
定义两层规范:
第一层定义根下各目录放什么文件
第二层对usr和var这两个目录做的定义

whereis -b mkdir 二进制命令
halt 关机命令 = init 0
reboot 重启命令 = init 6
shutdown -r now 重启 -h now 关机

[root@st1 ~]# mkfs.ext4 /dev/sdb 格式化磁盘
[root@st1 ~]# mount /dev/sdb /mnt/ 挂载磁盘
[root@st1 ~]# umount /mnt/ 卸载磁盘

[root@st1 ~]# mount -t ext4 /dev/sdb /mnt/ 以ext4类型挂载

小结:
重要目录: /dev /etc /proc /tmp /home /var /usr /bin /sbin
重要子目录:
/etc/sysconfig/network-scripts/ifcfg-eth0 网卡配置文件
/etc/resolv.conf 用户端DNS配置文件
/etc/hosts IP和域名和对应关系表
/etc/sysconfig/network 主机名更改,重启生效
/etc/fstab 记录开机挂载文件系统
/etc/rc.local 存放开机自启动程度命令的文件
/etc/inittab 存放启动等级的文件(Linux调动流程)
/etc/exports NFS配置文件
/etc/init.d 系统服务目录
/etc/profile 全局环境变量的文件(alias PATH)
/etc/profile.d 加载系统登录程序的目录,命令或文件独立存在
/etc/motd 远程登录后显示的信息配置文件
/etc/issue 控制台显示的信息配置文件
/etc/redhat-release 生成系统版本,CentOS release 6.5
*/etc/passwd /etc/shadow /etc/group /etc/gshadow 创建用户时需用到,可锁定
/etc/sudoers sudo配置文件,等同visodu
/etc/secuery 设定哪些终端可登录
/etc/login.defs 所有用户登录时的缺省配置
/etc/rsyslog 6.x的日志配置文件,5.x为syslog
/etc.re.local 开机自启动文件,一般编译安装的文件可放在这里

/usr/local 等同于windows下的Programs,默认软件安装目录
/usr/src 内核源码目录

/var/log 日志目录
*/var/log/messages 系统日志文件,每周更新,以日期结尾,5.x以数字结尾
*/var/log/secure 用户登录日志信息,查看哪些用户登录,每周更新,同上
/var/log/wtmp 最近登录信息
last 查看最近的登录日志,哪些在线
lastlog 查看用户列表中哪些登录过
/var/spool/
*/var/spool/cron/root 定时任务默认路径

/proc 内核及进程信息的虚拟文件系统,放磁盘/内在/cpu信息
/proc/version 内核版本信息
/proc/sys/kernel 系统内核功能文件
/proc/sys/net/ipv4/ 网络优化相关文件目录,前文对sysctl.conf配置,其实就是更改这些文件
/proc/cpuinfo 处理器信息
/proc/meminfo 系统内存信息
/proc/devices 设备信息
/proc/filesystem 文件系统信息
/proc/interrups 系统中断信息
/proc/loadavg 系统负载信息

Linux启动过程:
BOIS自检=====>MBR引导程序=====>GRUB引导菜单=====>加载内核=====>启动init进程
=====>读取inittab文件,执行rc等脚本=====>启动mimgetty=====>进入系统

文件类型:ls -l
变通文件:以 - 头
纯文本文件,可查看
二进制文件,可执行
数据文件,特定格式 /var/log/wtmp
目录文件:以d 开头,可加参数 -F或-p,目录后显示加/
字符文件:以c开头,基本用不到
块设备文件:以b开头, 一般为硬盘,光驱
套接口文件:以s开头,即sock类型文件
链接文件:以l开头,即wing下的快捷方式, ln -s 源 新链接
管道文件:以p开头,可用find查找,基本用不到
find / -type p | xargs ls -l 可用man find查看type的各类

文件和目录属性
ls -lhi
i 查看文件索引号
硬盘格式化后有两部分:Part1为indoe, Part2为black
black 存放数据
inode 存放用户文件的属性,不包含文件名
inode 5.x 为128字节,6.x为256字节

查看Inode大小,boot为128字节,其他为256字节,swap不可查看
[root@loutsx ~]# dumpe2fs /dev/sda1 | grep -i 'Inode size'
dumpe2fs 1.41.12 (17-May-2010)
Inode size: 128


************2017-08-02******************************************
linux命令及基础手把手实战

wc -l 看文件行数 -c字节 -m字符
cat /etc/services | wc -l

1. 100M空间可写入1K或1M大小多个文件
硬盘分为Inode和Block,正常Block为4K,小于4K也会占用4K。

2. 查看目录下一级目录
ls -l | grep '^d'
ls -l | sed -n /d/p
ls -l | awk /^d/
ls -lp | grep '/$' -p 目录后加/ -F 添加更多标记
-F, --classify
append indicator (one of */=>@|) to entries
find . -maxdepth 1 -type d
find . -type d ! -name '.' -prune
-maxdepth 1 只显示一层
如果没有-depth, -prune会生效,不进入目录中

3. 查看最近更新的文件
ls -lrt /etc/
r 反转 t 最近修改时间 放在最后


4. 显示文件颜色
alias grep='grep --color=auto'

5. 创建文件目录链接
ln -s /etc/sysconfig/network-scripts/ ./net

6. 保留Apache日志7天
可用软件自身功能操作 customlog
也可用脚本完成:
for n in `seq 7`
do
date -s "04/0$n/2017"
touch log_`(date+%F)`.log
注意这里有反引号,但这个脚本创建不成功-------------后面需要测试

find ./ -type f --exec rm {} \;
--exec \ 配对格式, {}为前面查到的结果,等同 |xargs rm -f
find ./ -type f -delete
三个一样的效果

[root@loutsx ~]# stat a.txt ----------查看文件时间
File: "a.txt"
Size: 113 Blocks: 8 IO Block: 4096 普通文件
Device: 803h/2051d Inode: 131385 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-08-03 12:40:18.371665686 +0800
Modify: 2017-07-30 22:47:57.121458596 +0800
Change: 2017-07-30 22:47:57.122458617 +0800

7. 打印内容及行号
cat -n file
less -N file
vi file ==> set nu
grep -n . file ----中间的点不能少
[root@loutsx ~]# grep -n . a.txt
1:what is your name?
2:-------2017-07-30----
3:this is my test
4:my is testing cat command
5:-----------------------------

8. 服务在3级别启动
chkconfig的级别其实是对应/etc/rc.d/rc目录,每个级别对应一个目录,chkconfig开启一个服务,其实就是将此服务在相应等级的目录中建一个软链接
chkconfig有一个配置文件,暂时没找到

9. 打包目录
tar zcvf file.tar.gz 目录
tar jcvf file.tar.bz 目录
z gz c 创建 v 显示 f 文件 j bz p 保持文件属性
解压:tar zxvf 包 -C 目录
-C 指定到目录中

tar zxvf file.tar.gz `find . -type d` 将找到的内容打包

10. 过滤以下文件中的loutsx和数字
my name is loutsx myqq is 38732387 ---filename my.txt
awk '{print $4 " " $7}' my.txt
cut -d" " -f4,7 my.txt
-d以什么侵害 -f选择列
cut ic 12-16 24- my.txt
-c以字符切割

my name is loutsx,myqq is 38732387 ---filename my.txt(加逗号)
awk -F '[ ,]' '{print $4 " " $7}' my.txt
-F '[ ,]' 可以多个字符分割
cut -d" " -f4,7 my.txt | tr "," ""
tr 文本替换

11. 查看文件多少行
wc -l 行数 -c 字节 -m 字符
cat -n
sed -n '$='
awk '{print NR}' a.txt | tail -1
grep -n $ a.txt| tail -1


************2017-08-04******************************************
linux系统文件属性知识

-rw-r--r-- 2 root root 18 Jul 21 17:34 a
2 这里的2是硬连接的个数
ln 源 目标 ----------这里不加参数,创建硬连接
硬链接:
1.具有相同Inode索引号的不同文件名
2.可以将重要文件创建硬链接,防止误删除
3.多个硬链接,删除文件不会删除内容
4.静态文件,所有硬链接删除才会删除数据
5.当硬链接删除,有新数据存放会占用这个空间或者通过fsck检查时,数据才会被回收。所以发现删除时及时关机
6.硬链接是文件的另一出口

软链接:或符号链接
readlink 软链接文件 查看软链接对应的路径
正常软链接访问: 软链接-->实际路径-->Indoe索引号-->Block-->找到文件
软链接和源文件有不同的Inode索引号

1. 软链接相当于快捷方式,指向源路径
2. 源不存在时,软链接僞存在,但已失效
3. 软链接和源文件有不同的Inode索引号

目录不能创建硬链接,在目录下已有.为当前目录的硬链接
目录不能跨越文件系统,创建目录时,父目录打硬链接数会增加1.也就是创建后,目录的硬链接是2

区别:
1.软件链接不源不是同Inode,硬链接是相同Inode
2.源删除时,软链接不生效,硬链接正常使用
3.目录不能创建硬链接

Linux文件删除原理
1.只有当硬链接全部删除时,文件才会删除
2.当有进程占用时,文件存在,不使用时,文件删除

控制文件删除:
1.受文件硬连接数限制,有一个硬链接i_link +1,减少一个硬链接,i_link -1,当i_link=0时,文件删除
2.受进程占用控制,当有进程使用时,i_count +1,即i_count=1,当减少一个进程占用i_count -1 ,即i_count=0,当没有进程调用时i_count = 0
当i_link=0 且i_count=0时,文件才会真正删除

意图:
创建一个虚拟磁盘,让Http生成的日志放在里面,到100%时删除文件不会释放空间,可重启服务或重写文件释放

dd if=/dev/zero of=/dev/sdc bs=8K count=10 ------------------创建虚拟磁盘
mkfs -t ext3 /dev/sdc ------------------格式化
mount -o loop /dev/sdc app/ ------------------挂载
df -h
tail -f log ------------------检查LOG
>log ------------------重写文件

for n in `seq 10000`;do curl -s 192.168.0.102 >/dev/null;done ------------自动访问IP,从而产生日志

du -sh /* 查看根下的目录大小
info 查看帮助
man cd 查看内置命令,Linux内置命令用help查看
alias, bg, bind, break, builtin, caller, cd, command, compgen, complete, compopt,
continue, declare, dirs, disown, echo, enable, eval, exec, exit, export, false, fc, fg, getopts,
hash, help, history, jobs, kill, let, local, logout, mapfile, popd, printf, pushd, pwd, read, read-
only, return, set, shift, shopt, source, suspend, test, times, trap, true, type, typeset, ulimit,
umask, unalias, unset, wait

用户和组
Linux用通过UID和GID来辨认用户和组的
虚拟用户,默认安装时产生,不能登录系统。
用户UID:
root 0
虚拟用户 1-499
普通用户 50065535

useradd mysql -s /sbin/nologin -M
-s 指定登录bash
-M 不生成家目录
userdel 删除用户
groupadd mysql -g 49 -----指定GID
useradd -u UID -s /sbin/nologin -g mysql ----- u 指定UID , g 指定组

服务要运行,必须要用户,可以不登录,工作中可以创建用户来运行相关的服务

stat 查看文件状态时间,有三个时间:Access,Modify,Change
ls -l --time-style=long-iso 以年月时显示文件时间
ls -lt 修改时间 -lc 状态改变时间 -lu 访问时间

开启Selinux后,文件属性会加上。如下
-rw-r--r--.

************2017-08-07******************************************
linux 正则表达式
是一套处理字符串的规则和方法,以行为单位对字符串进行处理。通过特殊符号和辅助,就可以快速的过滤、替换某些特定的字符串
标准正则表达式:
^ 以什么字符开头
$ 以什么字符结尾
. 表示任意一个字符(可代替source命令,如 . /etc/profile = source /etc/profile)
\ 将符号进行转意
* 重复0次或多次 前面字符
[] 任意可先字符集,如[0-9] [a-z]
[^] 匹配非^后的字符,以单个字符为单位
[n,m] 重复n-m次
[n,] 最少重复n次
[n] 重复n次
扩展正则表达式:
+ 重复1次或多次 前面字符
? 重复0次或1次 前面字符
| 用或的方式查找
() 找出组字符串,如 grep -E 'bl(o|o)g' file
ifconfig eth3 | sed -n '2 s#^.*addr:\([0-9].*\) Bcas.*$#\1#gp'


获取ifconfig中的IP地址
[263net@louts_37_121 ~]$ ifconfig eth3| grep 'inet addr'|awk -F ':' '{print $2}'|cut -d " " -f1
114.28.37.121
[263net@louts_37_121 ~]$ ifconfig eth3| grep 'inet addr'|awk -F '[: ]' '{print $13}'
114.28.37.121
[263net@louts_37_121 ~]$ ifconfig eth3| grep 'inet addr'|awk -F '[: ]+' '{print $4}'
114.28.37.121
[263net@louts_37_121 ~]$ ifconfig eth3 | awk -F '[ :]+' 'NR==2 {print $4}' ------这里NR要在引号中
114.28.37.121
[263net@louts_37_121 ~]$ cat /etc/sysconfig/network-scripts/ifcfg-eth3 | grep 'IPADDR' | cut -d '=' -f 2
114.28.37.121
可直接在sed中查询等号加正则
[263net@louts_37_121 ~]$ ifconfig eth3|sed -n '2p'|sed -n 's#^.*r:\(.*\) Bc.*$#\1#gp'
114.28.37.121
[263net@louts_37_121 ~]$ ifconfig eth3|sed -n '2 s#^.*r:\(.*\) Bc.*$#\1#gp'
114.28.37.121
[263net@louts_37_121 ~]$ ifconfig eth3|sed -n '2 s#^.*r:\([0-9].*\) Bc.*$#\1#gp'
114.28.37.121
得到IP和子网掩码
[263net@louts_37_121 ~]$ ifconfig eth3|sed -n '2 s#^.*r:\(.*\) Bc.*sk:\(.*\)$#\1 \2#gp'
114.28.37.121 255.255.255.0
得到MAC地址
[263net@louts_37_121 ~]$ ifconfig eth3 | grep 'HWaddr' | awk -F " " '{print $NF}'
46:20:9B:3C:31:F0
[263net@louts_37_121 ~]$ ifconfig eth3 | awk -F " " ' NR==1 {print $NF}'
46:20:9B:3C:31:F0


取得文件的数字权限 如644/755
[263net@louts_37_121 ~]$ stat ntt_traffic_report.log | sed -n '4p'|cut -d '/' -f1 | cut -d '(' -f2
0644
[263net@louts_37_121 ~]$ stat ntt_traffic_report.log | awk -F '[(/]' 'NR==4 {print $2}'
0644
[263net@louts_37_121 ~]$ ll ntt_traffic_report.log | cut -c 2-10 | tr rwx- 4210 | awk -F "" '{print $1+$2+$3 $4+$5+$6 $7+$8+$9}'
644
直接用stat命令的方法,如果一个命令能显示,那就有相关的参数可以获取内容,用man查询
[263net@louts_37_121 ~]$ stat -c %a ntt_traffic_report.log
644

 

 

 

------------------------2017/12/2 shell 第三课---------------------------------------
[bash]# cat a1.sh 
dirname $0   -------显示当前是脚本的路径
basename $0   -------显示当前是脚本的文件名 
[bash]# sh /home/loutsx/a1.sh     
/home/loutsx
a1.sh
[bash]# sh a1.sh 222 
a1.sh 
传入多个参数,用$n方式
[bash]# cat a2.sh 
echo $1  $2 
[bash]# sh a2.sh 111 222  
111 222 
大于9用${}包起来 
[bash]# cat a3.sh  
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} 
echo $#   -------显示传入参数的个娄 
exit 1 
[bash]# sh a3.sh 1 2 3 4 5 6 7 8 9 10 11 12 
1 2 3 4 5 6 7 8 9 10 11 
12 
[bash]# sh a3.sh {a..z} 
a b c d e f g h i j k 
26 
[bash]# dd 
^C0+0 records in 
0+0 records out 
0 bytes (0 B) copied, 1.63919 s, 0.0 kB/s 
$? 获取上一个命令的返回值,0为成功,2为权限拒绝,1-125为运行失败,126有命令无法执行,127找不到命令,128系统强制结束 
[bash]# echo $?         
130 
[bash]# sdg 
bash: sdg: command not found 
[bash]# echo $? 
127 
$* 所有传入的参数以单个字符串形式显示 
$@ 所有传入的参数分别以字符串形式显示 
[bash]#  vi a3.sh  
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} 
echo $# 
echo $* 
echo $@ 
exit 1 
[bash]# sh a3.sh {A..E}
A B C D E 
A B C D E 
A B C D E 
[bash]# echo $? 
[bash]# set -- " " loutsx sss.     
[bash]# echo $#    -----显示参数的个数 
[bash]# for i in "$*";do echo $i;done   ----以单个字符串形式显示 
loutsx sss. 
[bash]#  
[bash]# for i in "$@";do echo $i;done ------分别以字符串形式显示
loutsx 
sss. 
[bash]# for i in "$@";do echo $i;done
loutsx 
sss. 
[bash]# shift  -------参数向往称一个位置,第一个删除,可用shift num前移几个位置,实际用于脚本中 
[bash]# help shift 
shift: shift [n] 
    Shift positional parameters.  
    Rename the positional parameters $N+1,$N+2 ... to $1,$2 ...  If N is 
    not given, it is assumed to be 1. 
    Exit Status: 
    Returns success unless N is negative or greater than $#.       

 

[bash]# for i in "$@";do echo $i;done 
I am 
loutsx 
sss. 
[bash]# shift 
[bash]# for i in "$@";do echo $i;done 
loutsx 
sss.  
[bash]# shift 2 
[bash]# for i in "$@";do echo $i;done 
sss.
[bash]# cat a4.sh  -----将执行的PID放到一个文件中 
echo $$ >/tmp.a4.pid 
sleep 10 
[bash]# sh a4.sh  &   ------&后台方式执行 
[1] 1498 
[bash]# cat /tmp.a4.pid  
1504 
[2]   Done                    sh a4.sh 
[3]-  Done                    sh a4.sh 
[4]+  Done                    sh a4.sh 
[bash]# kill 1498 1502 1504   ---删除进行PID 
bash: kill: (1498) - No such process 
bash: kill: (1502) - No such process 
bash: kill: (1504) - No such process 

 [bash]# kill -USR2 `cat /tmp.a4.pid`  ----可用-USR2 直接删除PID,不需再ps查找PID 

bash: kill: (1514) - No such process 
[bash]# vi killpid.sh

 

***********************************

 

#!/bin/sh 
pid=/tmp/kill.pid 
if [-f "$pid"]   ------如果PID存在,则删除PID,并删除PID的文件 
 then 
  kill -USR2 `cat $pid`  >/dev/null 2>&1 
  rm -f $pid 
fi 
#input current script pid to /tmp/kill.pid 
echo $$ >$pid     ----再将新PID写入文件 
sleep 3000 
***********************************

 

[bash]# sh killpid.sh  & 
[2] 1625 
[bash]# cat /tmp/kill.pid  
1625 
[bash]# ps -ef | grep kill 
root      1625  1373  0 23:23 pts/0    00:00:00 sh killpid.sh 
root      1631  1373  0 23:23 pts/0    00:00:00 grep kill 
Bash内置命令,可用man cd或者man bash查看 
[bash]#  man cd 
BASH_BUILTINS(1)                                              BASH_BUILTINS(1)
NAME

 

       bash,  :, ., [, alias, bg, bind, break, builtin, caller, cd, command, compgen, complete, com- 
       popt, continue, declare, dirs, disown, echo, enable, eval, exec, exit, export, false, fc, fg, 
       getopts,  hash,  help, history, jobs, kill, let, local, logout, mapfile, popd, printf, pushd, 
       pwd, read, readonly, return, set, shift, shopt, source, suspend,  test,  times,  trap,  true, 
       type, typeset, ulimit, umask, unalias, unset, wait - bash built-in commands, see bash(1) 

 

变量子串操作命令
[bash]# aa="hello i am loutsx" 
[bash]# echo $aa 
hello i am loutsx 
[bash]# echo ${#aa}   -------${#string} 显示字符串的个数 
17 
[bash]# echo $aa | wc -L  
17 
[bash]# echo $aa | wc -m 
18 
[bash]# echo ${aa:2}       -------${string:num} 从第num后显示 
llo i am loutsx
[bash]# echo ${aa:2:7}}       -------${string:num:num} 显示中间的字符串 
llo i a 
[bash]# echo $aa | cut -c 3-6   ------也可以用cut -c方式显示 
llo  
[bash]# a1='abcABC123abcABC123ABCabc' 
[bash]# echo ${#a1} 
24 
[bash]# echo ${a1#a*c}   -------${string#parm} 从开始最短匹配 
ABC123abcABC123ABCabc 
[bash]# echo ${a1##a*c}   -------${string##parm} 从开始最长匹配 
[bash]# echo ${a1%a*c}  -------${string%parm} 从结尾最短匹配 
abcABC123abcABC123ABC 
[bash]# echo ${a1%%a*c}  -------${string%parm} 从结尾最长匹配
[bash]# echo ${a1/abc/mmm}  -------${string/parm1/parm2} 从开始最短替换 
mmmABC123abcABC123ABCabc 
[bash]# echo ${a1//abc/mmm}-------${string/parm1/parm2} 从开始最长替换 
mmmABC123mmmABC123ABCmmm
[bash]# echo ${a1/%abc/mmm}-------${string/%parm1/parm2} 从结尾最短替换 
abcABC123abcABC123ABCmmm 
[bash]# echo ${a1//abc/mmm}-------${string/%parm1/parm2} 从结尾最长替换 
mmmABC123mmmABC123ABCmmm

 

------------------------2017/12/3 shell 第三课之二---------------------------------------

 

Last login: Sun Dec  3 20:06:47 2017 from 114.28.38.198
批量改名 
[root@louts_test01 loutsx]# ll
-rw-r--r--. 1 root   root         0 Dec  3 21:21 hello_1_finish.txt 
-rw-r--r--. 1 root   root         0 Dec  3 21:21 hello_2_finish.txt 
-rw-r--r--. 1 root   root         0 Dec  3 21:21 hello_3_finish.txt 
-rw-r--r--. 1 root   root         0 Dec  3 21:21 hello_4_finish.txt
-rw-r--r--. 1 root   root         0 Dec  3 21:21 hello_5_finish.txt
[root@louts_test01 loutsx]# for f in `ls *fin*`;do mv $f `echo ${f%*fin*}`.jpg;done
[root@louts_test01 loutsx]# ll
-rw-r--r--. 1 root   root         0 Dec  3 21:21 hello_1_.jpg
-rw-r--r--. 1 root   root         0 Dec  3 21:21 hello_2_.jpg
-rw-r--r--. 1 root   root         0 Dec  3 21:21 hello_3_.jpg
-rw-r--r--. 1 root   root         0 Dec  3 21:21 hello_4_.jpg
-rw-r--r--. 1 root   root         0 Dec  3 21:21 hello_5_.jpg
 
批量改扩展名
[root@louts_test01 loutsx]# ll
-rw-r--r--. 1 root   root         0 Dec  3 21:21 hello_1_.txt
-rw-r--r--. 1 root   root         0 Dec  3 21:21 hello_2_.jpg
-rw-r--r--. 1 root   root         0 Dec  3 21:21 hello_3_.jpg
-rw-r--r--. 1 root   root         0 Dec  3 21:21 hello_4_.jpg
-rw-r--r--. 1 root   root         0 Dec  3 21:21 hello_5_.jpg
[root@louts_test01 loutsx]# for f in `ls *.jpg`;do mv $f ${f/%jpg/txt};done
[root@louts_test01 loutsx]# ll
total 11544
-rw-r--r--. 1 root   root         0 Dec  3 21:21 hello_1_.txt
-rw-r--r--. 1 root   root         0 Dec  3 21:21 hello_2_.txt
-rw-r--r--. 1 root   root         0 Dec  3 21:21 hello_3_.txt
-rw-r--r--. 1 root   root         0 Dec  3 21:21 hello_4_.txt
-rw-r--r--. 1 root   root         0 Dec  3 21:21 hello_5_.txt
-rw-r--r--. 1 root   root       176 Dec  2 23:19 killpid.sh
-rw-rw-r--. 2 loutsx loutsx      21 Nov 20 22:26 loutsx.txt
drwxr-xr-x. 3 root   root      4096 Nov 20 22:26 oldboy
-rw-r--r--. 1 root   root        15 Nov 29 22:33 tesh.sh
[root@louts_test01 loutsx]# chars=`seq -s " " 100`
[root@louts_test01 loutsx]# echo ${#chars}
291
[root@louts_test01 loutsx]# echo $(expr length "$chars")
291
[root@louts_test01 loutsx]# echo ${chars} | wc -L       
291
[root@louts_test01 loutsx]# time for i in $(seq 1000);do count=`echo ${#chars}`;done      -----内置计算最快,字符处理尽可能用内置的命令,管道的会慢     
real    0m1.056s
user    0m0.030s
sys     0m0.436s
[root@louts_test01 loutsx]# time for i in $(seq 1000);do count=`echo expr length ${chars}`;done       -----管道最慢      
real    0m1.130s
user    0m0.039s
sys     0m0.444s
[root@louts_test01 loutsx]# time for i in $(seq 1000);do count=`echo ${chars}|wc -L`;done         -----内置计算次之   
real    0m3.625s
user    0m0.373s
sys     0m2.102s
posted on 2017-07-23 23:34  syother  阅读(300)  评论(0编辑  收藏  举报