Linux Shell

路径

    CentOS

/etc/sysconfig/network-scripts/ifcfg-eth0 #网卡设置

/etc/sysconfig/network #主机名设置

 /etc/udev/rules.d/70-persistent-net.rules #mac地址与网卡映射地址

/etc/hosts #host设置

/etc/selinux/config #内核安全模块


查看端口(netstat)

netstat -nalp


检查命令(type、pstree、file)

[root@node01 ~]# type -a ls
ls is aliased to `ls --color=auto'
ls is /bin/ls

[root@node01 ~]# pstree
init─┬─auditd───{auditd}
     ├─console-kit-dae───63*[{console-kit-da}]
     ├─crond
     ├─dbus-daemon
     ├─login───bash
     ├─master─┬─pickup
     │        └─qmgr
     ├─5*[mingetty]
     ├─rsyslogd───3*[{rsyslogd}]
     ├─sshd───sshd───bash───pstree
     └─udevd
[root@node01 ~]# file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
[root@node01 ~]# file /usr/bin/yum
/usr/bin/yum: a /usr/bin/python script text executable
[root@node01 upload]# whereis ifconfig #显示命令的文件和相关文件的位置
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz

帮助(help、man)

help cd #内部命令

#安装 
yum install man man-pages
#使用 外部命令
man ls 
# 空格 向下翻页
# B 想上翻页
# / 搜索,N 切换匹配到的字段
# Q 退出

进程(ps)

[root@node01 ~]# echo $$
1202
[root@node01 ~]# ps -fe
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 12:47 ?        00:00:01 /sbin/init
root          2      0  0 12:47 ?        00:00:00 [kthreadd]

[root@jeffrey-aliyun ~]# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.3  51472  3120 ?        Ss   Jan11   0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root         2  0.0  0.0      0     0 ?        S    Jan11   0:00 [kthreadd]



文件系统命令

文件列表(ls)

[root@node01 ~]# ls -l
total 1812
-rw-------. 1 root root     900 Jul 31  2017 anaconda-ks.cfg
drwxr-xr-x  2 root root    4096 Aug 31  2017 back
-rw-r--r--  1 root root      41 Aug  7  2017 devin

按顺序依次是:

文件类型:    
      -:普通文件 (f)            
      d: 目录文件
      b: 块设备文件 (block)
      c: 字符设备文件 (character)
      l: 符号链接文件(symbolic link file)
      p: 命令管道文件(pipe)
      s: 套接字文件(socket)

文件权限9位,每3位一组,3组 权限(owner,group,other)每一组:rwx(读,写,执行), r--
文件硬链接的次数
文件的属主(owner)
文件的属组(group)
文件大小(size)单位是字节
时间戳(timestamp)最近一次被修改的时间
      访问:access
      修改:modify,文件内容发生了改变
      改变:change,metadata,元数据

文件名

ls -l #默认按文件名排序
ls -lr #倒序
ls -lt #按时间排序
ls -a #显示所有文件,包括隐藏文件
[root@node01 ~]# ls -li #第一列显示磁盘寻址头
total 1812
3407881 -rw-------. 1 root root     900 Jul 31  2017 anaconda-ks.cfg


挂载(mount)

mount /dev/cdrom /mnt #挂载

umount /mnt #取消挂载


硬盘分区(df)

[root@node01 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       146G  2.8G  136G   2% /
tmpfs           491M     0  491M   0% /dev/shm
/dev/sda1       194M   28M  157M  15% /boot


查看文件大小(du)

du -sh ./ #查看指定文件夹大小
du -ah ./ #迭代查看所有文件
du -h ./ #查看指定文件夹下的各个文件夹大小
du -ah ./ | sort -n #文件按大小排序


查看内存(free)

[root@node01 yum.repos.d]# free -m
             total       used       free     shared    buffers     cached
Mem:           980        260        720          0         14        168
-/+ buffers/cache:         77        903
Swap:         2047          0       2047


文件移动

pwd #当前目录

cp -r ./ ../back #复制文件夹
cp /etc/{profile,init.d/killall} ./ #拷贝多个文件,花括号扩展

rm -fr /a #删除文件夹

mkdir -p a/b/c/d #迭代创建文件夹(垂直)
mkdir -p a/s{1,2,3}dir #水平创建多个文件夹

tar -xf ./pag.tar #解压


切换目录(cd)

cd ~ #回到家目录
cd ~devin #去到devin用户的家目录
cd - #回到上一次目录 ***
cd .. #回到上级目录


链接(ln)

默认为硬链接,指向物理地址,既复制一个引用,相当于两个引用指向同一个文件(例子中两个文件寻址头相同)

[root@node01 exp]# ln ln.txt ln01.txt
[root@node01 exp]# ls -li
total 0
3409036 -rw-r--r-- 2 root root 0 Jun 15 15:44 ln01.txt
3409036 -rw-r--r-- 2 root root 0 Jun 15 15:44 ln.txt

[root@node01 exp]# rm -f ln.txt #删除ln后,ln01还有内容,可见为两个引用
[root@node01 exp]# cat ln01.txt 
has content!!

软链接,引用指向另外一个引用

[root@node01 exp]# ln -s ln.txt ln02.txt
[root@node01 exp]# ll
total 4
lrwxrwxrwx 1 root root  6 Jun 15 15:54 ln02.txt -> ln.txt
-rw-r--r-- 1 root root 14 Jun 15 15:52 ln.txt

[root@node01 exp]# rm -f ln.txt #删除文件后,引用ln02找不到文件了,因为它指向的引用ln已经被删除,硬链接还有是因为不是指向的引用,而是实际物理地址
[root@node01 exp]# cat ln02.txt 
cat: ln02.txt: No such file or directory


文件信息(stat)

[root@node01 ~]# stat install.log
  File: `install.log'
  Size: 8815      	Blocks: 24         IO Block: 4096   regular file
Device: 803h/2051d	Inode: 3407874     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2017-07-31 20:11:11.357999918 +0800
Modify: 2017-07-31 20:13:26.029999814 +0800
Change: 2017-07-31 20:13:31.646999810 +0800

access:访问时间

modify:内容修改时间

change:元数据修改时间

[root@node01 ~]# touch install.log #touch之后各个时间都一样了,也就是说做文件监控时,先touch一下文件,一段时间后检查,三个时间是否一致,不一致的话文件肯定被修改了
[root@node01 ~]# stat install.log
  File: `install.log'
  Size: 8815      	Blocks: 24         IO Block: 4096   regular file
Device: 803h/2051d	Inode: 3407874     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-06-15 16:05:22.087845954 +0800
Modify: 2018-06-15 16:05:22.087845954 +0800
Change: 2018-06-15 16:05:22.087845954 +0800


创建文件(touch)

touch newfile
echo a >> a.txt


文本操作命令


查看(cat)

cat /etc/profile

分屏查看文件内容(more、less)

more /etc/profile
# 空格,一屏一屏看
# 回车,一行一行看

less /etc/profile #分屏查看,支持来回浏览,缺点是会一次将文件加载到内存
# 空格,向下翻页
# B键,向上翻页
# 上下方向键,向上向下翻行


查看文件前部的内容(head)

head -5 /etc/profile #查看文件前部5行


查看文件尾部的内容(tail)

tail /etc/profile #默认显示最后10行
tail -100 #显示最后100行
head -5 /etc/profile | tail -1
# 显示第5行,利用管道,相当于游标读取

tail -f /etc/profile #监控此文件尾部

管道(|)

ls没有输入流,利用xargs转换输入流为参数

[root@node01 exp]# echo / | xargs ls -l
total 94
dr-xr-xr-x.  2 root root  4096 Aug  3  2017 bin
dr-xr-xr-x.  5 root root  1024 Jul 31  2017 boot
管道的左边的命令,并不是在主进程先执行完再把结果通过管道传递给另外一个命令;
而是bash会 创建一个子进程 来执行左边的命令,创建 另外一个子进程 来执行右边的命令,再把左边的输出流跟右边的输入流连接起来

文本编辑器(vi)

打开文件
     vim /path/to/somefile   ::G
     vim +# :打开文件,并定位于第#行
     vim +:打开文件,定位至最后一行
     vim +/PATTERN : 打开文件,定位至第一次被PATTERN匹配到的行的行首
关闭文件
     末行模式:
         :q  退出  没有动过文件
         :wq 保存并退出   动过了,不后悔
         :q! 不保存并退出  动过了,后悔了
         :w 保存
         :w! 强行保存
         :wq --> :x

    编辑模式:

        ZZ: 保存并退出   不需要冒号

模式:        
     编辑模式:
按键具有编辑文本功能:默认打开进入编辑模式
     输入模式:
按键本身意义
     末行模式:
接受用户命令输入,编辑模式冒号进入
编辑-->输入:    
      i: 在当前光标所在字符的前面,转为输入模式;
      a: 在当前光标所在字符的后面,转为输入模式;
      o: 在当前光标所在行的下方,新建一行,并转为输入模式;

      O:在当前光标所在行的上方,新建一行,并转为输入模式; 
      I:在当前光标所在行的行首,转换为输入模式
      A:在当前光标所在行的行尾,转换为输入模式
输入-->编辑
      ESC
编辑-->末行
      :
末行-->编辑
      ESC, ESC
移动光标 -- 编辑模式   
     字符
         h: 左;j: 下;k: 上;l: 右
     单词
         w: 移至下一个单词的词首    
         e: 跳至当前或下一个单词的词尾
         b: 跳至当前或前一个单词的词首
     行内
         0: 绝对行首
         ^: 行首的第一个非空白字符
         $: 绝对行尾    
     行间
         G:文章末尾
         3G:第3行
         gg:文章开头
     翻屏
         ctrl+f,ctrl+b
删除&替换单个字符
     x:删除光标位置字符
     3x:删除光标开始3个字符
     r:替换光标位置字符
删除命令
     dw,dd,3dd
复制粘贴
     yw,yy,3yy
     p
剪切
     dd
     p
撤销&重做
     u   撤销
     ctrl+r  重做 撤销的操作
     .  重复上一步的操作

末行模式

set:设置
     set nu
     set nonu
     set readonly
/ :查找    
     /after 查找after
     n 向下切换
     N 向上切换 
     ?该位置再向上查找新单词
!:执行命令
     例子: :! ls -l /
s查找并替换
      s/str1/str2/gi        
      /:为边界字符:支持:/,@,#
      g:一行内全部替换
      i:忽略大小写    
      例子:%s/after/before/gi
范围    
      n :行号
      . :当前光标行
      +n :偏移n行
      $ :末尾行,$-3
      % :全文
      例子
          1,$-3d
          1.$y        
          1,$-6s/after/before/gi


grep

    显示匹配行

      v:反显示,反选

      E:使用扩展正则表达式

      e: 使用多个正则表达式

     正则表达式 

匹配操作符    
 
    \                  转义字符,与java的区别:java是字符串先编译再解析正则,所有需要用到转义符时,需要传\\
 
    .                   匹配任意单个字符
 
    [1249a],[^12],[a-k]  字符序列单字符占位
 
    ^                 行首
 
    $                  行尾
 
    \<,\>  \<abc      单词首尾边界,java中为\\b
 
    |                   连接操作符
 
    \(,\)              选择操作符, \index 反向引用
重复操作符:
 
    ?       匹配0到1次。
 
    *       匹配0到多次。
 
    +      匹配1到多次。
 
    {n}    匹配n次。
 
    {n,}   匹配n到多次。
 
    {n,m}      匹配n到m次。
 
    与扩展正则表达式的区别:grep默认时基本正则表达式,所以下列字需要转义,-E可以使用扩展正则表达式
 
        \?, \+, \{, \|, \(, and \)
 
    .* 匹配任意字符

测试:

cat test 

aaabbcaaa
aa bbc aaa
bb bbc bbb
asgodssgoodsssagodssgood
asgodssgoodsssagoodssgod
sdlkjflskdjf3slkdjfdksl
slkdjf2lskdjfkldsjl

grep "a" test
grep  "a\{3\}"  test
grep  "\<aaa"  test
grep  "\<aaa\>"  test
grep "b" test
grep  "b\{2,3\}" test 
grep "god" test
grep "godgood" test
grep "god*good" test
grep "god.*good" test
grep "god.*good.*god.*good" test
grep "god.*good+" test
grep "\(god.*good\)+" test
grep "\(god\).*good.*\1" test
grep "\(god\).*\(good\).*\1.*\2" test
grep "\(god\).*\(good\).*\1.*\2" test
grep "\(god\).*\(good\).*\2.*\1" test



文本处理命令

文本行垂直切割(cut)

f:选择显示的列
s:不显示没有分隔符的行
d:自定义分隔符
c :以字符为单位进行分割

[root@node01 ~]# cat test.txt 
iaasd asdasd
dddd dddd dddd
ddd ddd
dddddd
ddd
[root@node01 ~]# cut -d ' ' -f 1 test.txt  #已空格分割显示第一列,没有分隔符的行也显示了
iaasd
dddd
ddd
dddddd
ddd
[root@node01 ~]# cut -d ' ' -f 3 test.txt  #已空格分割显示第三列,没有分隔符的行也显示了


dddd

dddddd
ddd
[root@node01 ~]# cut -d ' ' -f 1,3 test.txt #显示第一列和第三列
iaasd
dddd dddd
ddd
dddddd
ddd
[root@node01 ~]# cut -d ' ' -f 1-3 test.txt #显示第一列到第三列
iaasd asdasd
dddd dddd dddd
ddd ddd
dddddd
ddd
[root@node01 ~]# cut -d ' ' -f 1-3 -s test.txt #不显示没有分割符的行
iaasd asdasd
dddd dddd dddd
ddd ddd

    读取 ip

[root@node01 ~]# ifconfig | grep "\<inet\>" | cut -d ' ' -f 10
172.17.206.85
127.0.0.1
[root@node01 ~]# grep "^IPADDR=" /etc/sysconfig/network-scripts/ifcfg-eth0 | cut -d '=' -f 2
172.17.206.85


文本行排序(sort)

n:按数值排序
r:倒序
t:自定义分隔符
k:选择排序列
u:合并相同行
f:忽略大小写

[root@node01 exp]# cat sort.txt 
banana 12
apple 1
orange 8
[root@node01 exp]# sort sort.txt #默认按字典序排序
apple 1
banana 12
orange 8
[root@node01 exp]# sort -t ' ' -k 2 sort.txt #已空格分割,按第二列排序,可以看到,默认是以第二列字典序排序
apple 1
banana 12
orange 8
[root@node01 exp]# sort -t ' ' -k 2 -n sort.txt #加上-n就以数值排序
apple 1
orange 8
banana 12

[root@node01 ~]# du -ah | sort -t $'\t' -k 1 -hr | sed -n '1,5p'
287M	.
285M	./upload
276M	./upload/spark-1.6.0-bin-hadoop2.6.tgz
9.0M	./upload/apache-tomcat-8.0.44.tar.gz
1.7M	./hihdfs.txt

$'\t' 取 tab 的 ascii 码

WordCount统计(wc)

l: 统计行
c: 统计字节
m: 统计字符
w: 统计单词数
L: 统计最长的行

[root@node01 exp]# cat sort.txt 
banana 12
apple 1
orange 8
[root@node01 exp]# wc -l sort.txt 
3 sort.txt
[root@node01 exp]# wc -w sort.txt 
6 sort.txt
[root@node01 exp]# wc -m sort.txt 
27 sort.txt
[root@node01 exp]# wc -L sort.txt 
9 sort.txt

[root@node01 exp]# ls -l ./ | wc -l
5


行编辑器(sed)

sed [options]  "AddressCommand" file

options    
 
    -n: 静默模式,不再默认显示模式空间中的内容,默认只输出,不修改源文件
 
    -i : 直接修改原文件
 
    -e SCRIPT -e SCRIPT:可以同时执行多个脚本
 
    -f /PATH/TO/SED_SCRIPT
 
     -r: 表示使用扩展正则表达式

Address    
 
    可以没有,全部
 
    给定范围,$表示最后一行、3,$ 
 
    查找指定行:/str/,包含str的行

Command
 
    d: 删除符合条件的行;
 
    p: 显示符合条件的行;
 
    a\string: 在指定的行后面追加新行,内容为string
 
     \n:可以用于换行
 
    i\string: 在指定的行前面添加新行,内容为string
 
    r FILE: 将指定的文件的内容添加至符合条件的行处
 
    w FILE: 将地址指定的范围内的行另存至指定的文件中;
 
    s/pattern/string/修饰符: 查找并替换,默认只替换每行中第一次被模式匹配到的字符串
 
        g: 行内全局替换
 
        i: 忽略字符大小写

[root@node01 exp]# cat test.txt 
iaasd asdasd
dddd dddd dddd
ddd ddd
dddddd
ddd
[root@node01 exp]# sed "2a\hello world" test.txt #在第二行后面追加hello world
iaasd asdasd
dddd dddd dddd
hello world
ddd ddd
dddddd
ddd
[root@node01 exp]# cat test.txt #未写入到源文件
iaasd asdasd
dddd dddd dddd
ddd ddd
dddddd
ddd
[root@node01 exp]# sed -i "2a\hello world" test.txt #加上-i选项
[root@node01 exp]# cat test.txt  #写入到源文件
iaasd asdasd
dddd dddd dddd
hello world
ddd ddd
dddddd
ddd

    查找并替换

[root@node01 exp]# cat test.txt 
iaasd asdasd
dddd dddd dddd
hello world
ddd ddd
dddddd
ddd
[root@node01 exp]# sed "s/ddd/ccc/g" test.txt #替换所有行的ddd为ccc
iaasd asdasd
cccd cccd cccd
hello world
ccc ccc
cccccc
ccc
[root@node01 exp]# sed "2s/ddd/ccc/g" test.txt #只替换第二行的
iaasd asdasd
cccd cccd cccd
hello world
ddd ddd
dddddd
ddd
[root@node01 exp]# sed "/\<dddd\>/s/ddd/ccc/g" test.txt #只替换包含单词dddd的行,不过这没意义,只需要使用查找替换就可以了,不需要指定Address
iaasd asdasd
cccd cccd cccd
hello world
ddd ddd
dddddd
ddd

[root@node01 exp]# cat inittab #修改Linux命令行模式为图形模式,3 -> 5
# 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:

[root@node01 exp]# sed "s/\(id:\)[0-6]\+\(:initdefault:\)/\15\2/" 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:5:initdefault:
# /\15\2/ 反向引用第1位和第二位,并在两者中间添加5

[root@node01 exp]# cat ifcfg-eth0 #修改ip的主机号,将主机替换为21
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.26.11
NETMASK=255.255.255.0
GATEWAY=192.168.26.2
DNS1=114.114.114.114

[root@node01 exp]# sed "s/\(IPADDR=\([1-9][0-9]\{0,2\}\.\)\{3\}\)[0-9]\{1,3\}/\121/" ifcfg-eth0 
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.26.21
NETMASK=255.255.255.0
GATEWAY=192.168.26.2
DNS1=114.114.114.114


文本分析工具(awk)

awk就是把文件逐行的读入,以IFS定义(空格,制表符)为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk -F ‘split’ 'BEGIN{}  pattern  {action} END{}' {filenames}

需要用单引号, 中间的大括号{},每行执行一次,BEGIN、END需要大写

支持自定义分隔符,-F
支持正则表达式匹配 ~ 波浪线正则匹配操作符
支持自定义变量,数组  a[1]  a[tom]  map(key)
支持内置变量

ARGC               命令行参数个数
ARGV               命令行参数排列
ENVIRON            支持队列中系统环境变量的使用
FILENAME           awk浏览的文件名
FNR                浏览文件的记录数
FS                 设置输入域分隔符,等价于命令行 -F选项
NF                 浏览记录的域的个数
NR                 已读的记录数,从1开始
OFS                输出域分隔符
ORS                输出记录分隔符
RS                 控制记录分隔符

$0,$1,$2...  每一行分割后对应列的值,$0取整行

支持函数

print、split、substr、sub、gsub

支持流程控制语句,类C语言

if、while、do/while、for、break、continue

使用:

文件 passwd:

[root@node01 exp]# cat passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

只是显示/etc/passwd的账户:

[root@node01 exp]# awk -F ':' '{print $1}' ./passwd 
root
bin
daemon
adm
lp
sync
shutdown

只显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以制表符分割,添加表头表尾:

[root@node01 exp]# awk -F ':' 'BEGIN{print "name\tshell"}{print $1 "\t" $7}END{print "handle by Jeffrey.deng"}' ./passwd 
name	shell
root	/bin/bash
bin	/sbin/nologin
daemon	/sbin/nologin
adm	/sbin/nologin
lp	/sbin/nologin
sync	/bin/sync
shutdown	/sbin/shutdown
handle by Jeffrey.deng
只显示包含nologin的行:

[root@node01 exp]# awk 'BEGIN{print "this is lines that contain nologin"} /nologin/ {print $0}' ./passwd 
this is lines that contain nologin
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@node01 exp]# awk -F':' '$7~/nologin/ {print $1}' ./passwd #指定第7列符合后面的正则表达式
bin
daemon
adm
lp

统计文件中,每行的行号,每行的列数,对应的完整行内容:

[root@node01 exp]# awk -F':' 'BEGIN{print "row\tcol\tline"} {print NR "\t" NF "\t" $0}' ./passwd 
row	col	line
1	7	root:x:0:0:root:/root:/bin/bash
2	7	bin:x:1:1:bin:/bin:/sbin/nologin
3	7	daemon:x:2:2:daemon:/sbin:/sbin/nologin
4	7	adm:x:3:4:adm:/var/adm:/sbin/nologin
5	7	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6	7	sync:x:5:0:sync:/sbin:/bin/sync
7	7	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown


文件 workpay:

[root@node01 exp]# cat workpay 
Tom	 0   2012-12-11      car     3000
John	 1   2013-01-13      bike    1000
vivi	 1   2013-01-18      car     2800
Tom	 0   2013-01-20      car     2500
John	 1   2013-01-28      bike    3500
统计报表:合计每人1月工资,0:manager,1:worker:

# 格式化的代码
awk -F '\t' 
'
{
	split($3, date, "-"); #将分割后的存入到date数组
	if(date[2]=="01"){ #下标从1开启
		names[$1] += $5; #awk语法支持对数组以字符串作为下标
	}
} 
END {
	for(i in names){ #取到names
		print i "\t" names[i]
	}
}
' 
./workpay 

[root@node01 exp]# awk -F '\t' '{split($3, date, "-"); if(date[2]=="01"){names[$1]+=$5;}} END{for(i in names){print i "\t" names[i]}}' ./workpay 
vivi	2800
Tom	2500
John	4500

还需要打印出工人的角色:

awk -F '\t' 
'
{
	split($3, date, "-"); 
	if(date[2]=="01"){
		names[$1]+=$5;
	}
	if($2=="0"){
		role[$1]="manager"
	}else{
		role[$1]="worker"
	}
} 
END {
	for(i in names){
		print i "\t" role[i] "\t" names[i]
	}
}
' 
./workpay 

[root@node01 exp]# awk -F '\t' '{split($3, date, "-"); if(date[2]=="01"){names[$1]+=$5;} if($2=="0"){role[$1]="manager"}else{role[$1]="worker"}} END{for(i in names){print i "\t" role[i] "\t"  names[i]}}' ./workpay 
vivi	worker	2800
Tom	manager	2500
John	worker	4500



用户管理

添加用户(useradd)

[root@node01 ~]# useradd jeffrey.deng # 添加用户jeffrey.deng
[root@node01 ~]# passwd jeffrey.deng #添加后需设置密码才能使用
Changing password for user jeffrey.deng.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@node01 ~]# useradd jeffrey.devin #添加用户jeffrey.devin
[root@node01 ~]# passwd jeffrey.devin
Changing password for user jeffrey.devin.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

每个用户默认有一个自己的组,这个组只有他自己一个(id):

[jeffrey.devin@node01 ~]$ id jeffrey.devin
uid=501(jeffrey.devin) gid=501(jeffrey.devin) groups=501(jeffrey.devin)
[jeffrey.devin@node01 ~]$ id jeffrey.deng
uid=500(jeffrey.deng) gid=500(jeffrey.deng) groups=500(jeffrey.deng)

每个用户有个自己的家目录,这个用户只有自己和root能访问:

[jeffrey.devin@node01 jeffrey]$ ll /home 
total 8
drwx------ 3 jeffrey.deng  jeffrey.deng  4096 Jun 19 14:49 jeffrey.deng
drwx------ 3 jeffrey.devin jeffrey.devin 4096 Jun 19 14:50 jeffrey.devin


用户组

添加一个组(groupadd):

[root@node01 home]# groupadd sharejeffrey

将用户添加至该组(usermod):

[root@node01 home]# usermod -a -G sharejeffrey jeffrey.deng # -a 追加 ,-G 组, sharejeffrey 组名,jeffrey.deng 用户名
[root@node01 home]# usermod -a -G sharejeffrey jeffrey.devin
[root@node01 home]# id jeffrey.deng
uid=500(jeffrey.deng) gid=500(jeffrey.deng) groups=500(jeffrey.deng),502(sharejeffrey)
[root@node01 home]# id jeffrey.devin
uid=501(jeffrey.devin) gid=501(jeffrey.devin) groups=501(jeffrey.devin),502(sharejeffrey)

创建一个属于sharejeffrey组的目录(chown):

[root@node01 opt]# mkdir jeffrey
[root@node01 opt]# ll
total 8
drwxr-xr-x 2 root root 4096 Jun 19 14:56 jeffrey
[root@node01 opt]# chown root:sharejeffrey jeffrey  #root 所有者(不修改可省略),sharejeffrey 所属组, jeffrey 修改的组
[root@node01 opt]# ll
total 8
drwxr-xr-x 2 root sharejeffrey 4096 Jun 19 14:56 jeffrey #所属组已经修改为sharejeffrey了
[root@node01 opt]# chmod g+w jeffrey  # [a,u,g,o] [+-] [rwx] 给组加上写权限
[root@node01 opt]# ll
total 8
drwxrwxr-x 2 root sharejeffrey 4096 Jun 19 14:56 jeffrey
[root@node01 opt]# chmod o-rx jeffrey #给其他用户删除读执行权限
[root@node01 opt]# ll
total 8
drwxrwx--- 2 root sharejeffrey 4096 Jun 19 14:56 jeffrey

测试文件:

[root@node01 jeffrey]# su jerffrey.deng #切换到用户
[jeffrey.deng@node01 jeffrey]$ echo "jeffrey text by deng" > demo.txt
[jeffrey.deng@node01 jeffrey]$ ll
total 4
-rw-rw-r-- 1 jeffrey.deng jeffrey.deng 13 Jun 19 15:05 demo.txt #默认组为jeffrey.deng,所属组有读写权限
[jeffrey.deng@node01 jeffrey]$ chown :sharejeffrey ./demo.txt #将文件所属组修改为sharejeffrey
[jeffrey.deng@node01 jeffrey]$ ll
total 4
-rw-rw-r-- 1 jeffrey.deng sharejeffrey 13 Jun 19 15:05 demo.txt

[jeffrey.deng@node01 jeffrey]$ su jeffrey.devin #切换到devin用户
Password: 
[jeffrey.devin@node01 jeffrey]$ vi demo.txt  #修改
[jeffrey.devin@node01 jeffrey]$ cat demo.txt  #修改成功
jeffrey text by deng!
jeffrey text by devin!

由上发现用户创建文件,其组默认为用户同名组,如何修改默认组呢? newgrp

[jeffrey.devin@node01 jeffrey]$ newgrp sharejeffrey #修改devin的默认组为sharejeffrey
[jeffrey.devin@node01 jeffrey]$ echo "change by newgrp, now need add write auth to file" > newgrp.txt
[jeffrey.devin@node01 jeffrey]$ ll
total 4
-rw-r--r-- 1 jeffrey.devin sharejeffrey 50 Jun 19 15:10 newgrp.txt #所属组默认就为sharejeffrey,但是组权限只有r读了
[jeffrey.devin@node01 jeffrey]$ chmod g+w newgrp.txt #给组加上写权限
[jeffrey.devin@node01 jeffrey]$ ll
total 4
-rw-rw-r-- 1 jeffrey.devin sharejeffrey 50 Jun 19 15:10 newgrp.txt


用户删除(userdel)

组删除(groupdel)


权限管理

chown

chown root:sharejeffrey jeffrey  #root 所有者(不修改可省略),sharejeffrey 所属组, jeffrey 修改的组
chmod

     第一种:

chmod g+w jeffrey  # [a,u,g,o] [+-] [rwx] 给组加上写权限
chmod o-rx jeffrey # 给其他用户删除读执行权限

    第二种:

[root@node01 tmp]# mkdir auth
[root@node01 tmp]# ll
total 4
drwxr-xr-x 2 root root 4096 Jun 19 16:21 auth
[root@node01 tmp]# chmod 777 auth
[root@node01 tmp]# ll
total 4
drwxrwxrwx 2 root root 4096 Jun 19 16:21 auth
[root@node01 tmp]# chmod 421 auth
[root@node01 tmp]# ll
total 4
dr---w---x 2 root root 4096 Jun 19 16:21 auth

由上面例子可得:

    三位数字按顺序依次代表:所有者、所属组、其他用户

    其中每位: 4:读,2:写,1:执行

        所以 7:4+2+1,读+写+执行

                5:4+1,读+执行

                6:4+2,读+写

                3:2+1,写跟执行

一般来说:

    文件夹权限一般为奇数,(755),因为文件夹需要读和执行权限,而执行权限是唯一的奇数

    文件一般为偶数,(644),因为文件一般不给执行权限



软件安装

编译安装

1、cat README:  首先查看软件源码包帮助文件
2、./configure:
来创建Makefile(配置文件)、检查操作系统、检查编译环境

  ./configure --help : 查看帮助
 ./configure --prefix
: 安装位置

3、make:编译,读取Makefile文件配置来编译
4、make install:
复制文件安装

卸载:    

make uninstall:如果有这个命令就使用,没有就只能手动删除
make clean: 
清除配置和编译,rm -fr Makefile objs

注意:

编译环境
软件依赖
配置项

Makefile文件:告诉make命令,如何去编译和安装



RPM安装

Redhat提供了rpm管理体系
已经编译的软件包:针对不同的平台系统编译目标软件包
操作系统维护安装信息
软件包包含依赖检查,但还需人为解决依赖

选项

-v Print verbose information - normally routine progress messages will be displayed.

-h(hash) Print 50 hash marks as the package archive is unpacked.  Use with -v|--verbose for  a nicer display.

安装

-i--install

rpm -ivh upload/jdk.rpm

    安装到新位置:

--prefix NEWPATH
              For relocatable binary packages, translate all file paths that start with the instal-
 
           lation prefix in the package relocation hint(s) to NEWPATH.

升级

-U: --upgrade , This  upgrades  or installs the package currently installed to a newer version

rpm -Uvh jdk-1.7.0_67-fcs.x86_64
修复

-F:  --freshen(fix)

rpm -Fvh jdk-1.7.0_67-fcs.x86_64

卸载

-e --erase

rpm -e jdk #可模糊匹配

查询(-q)

-qa查询已经安装的所有包

[root@node01 ~]# rpm -qa | head -10
libpng-1.2.49-1.el6_2.x86_64
setup-2.8.14-20.el6_4.1.noarch
avahi-libs-0.6.25-15.el6.x86_64
basesystem-10.0-4.el6.noarch
ConsoleKit-libs-0.4.1-3.el6.x86_64
kernel-firmware-2.6.32-431.el6.noarch
cjkuni-fonts-common-0.2.20080216.1-36.el6.noarch
nss-softokn-freebl-3.14.3-9.el6.x86_64
libtdb-1.2.10-1.el6.x86_64
libxcb-1.9.1-2.el6.x86_64
-q  PACKAGE_NAME:  查询指定的包是否已经安装

[root@node01 ~]# rpm -q jdk
jdk-1.7.0_67-fcs.x86_64
[root@node01 ~]# rpm -qa | grep jdk
jdk-1.7.0_67-fcs.x86_64
-qi PACKAGE_NAME:  查询指定包的说明信息

[root@node01 ~]# rpm -qi jdk
Name        : jdk                          Relocations: /usr/java 
Version     : 1.7.0_67                          Vendor: Oracle Corporation
Release     : fcs                           Build Date: Sat 26 Jul 2014 12:56:56 AM CST
Install Date: Wed 02 Aug 2017 05:52:23 PM CST      Build Host: sc14160135.us.oracle.com
Group       : Development/Tools             Source RPM: jdk-1.7.0_67-fcs.src.rpm
Size        : 206940196                        License: http://java.com/license
Signature   : (none)
Packager    : Java Software <jre-comments@java.sun.com>
URL         : URL_REF
Summary     : Java Platform Standard Edition Development Kit
Description :
The Java Platform Standard Edition Development Kit (JDK) includes both
the runtime environment (Java virtual machine, the Java platform classes
and supporting files) and development tools (compilers, debuggers,
tool libraries and other tools).

The JDK is a development environment for building applications, applets
and components that can be deployed with the Java Platform Standard
Edition Runtime Environment.
-ql PACKAGE_NAME:  查询指定包安装后生成的文件列表

[root@node01 ~]# rpm -ql jdk | head -10
/etc
/etc/.java
/etc/.java/.systemPrefs
/etc/.java/.systemPrefs/.system.lock
/etc/.java/.systemPrefs/.systemRootModFile
/etc/init.d/jexec
/usr
/usr/java
/usr/java/jdk1.7.0_67
/usr/java/jdk1.7.0_67/COPYRIGHT
-qc PACEAGE_NEME:查询指定包安装的配置文件

-qd PACKAGE_NAME:  查询指定包安装的帮助文件

-q --scripts PACKAGE_NAME:  查询指定包中包含的脚本 

-qf /path/to/somefile:  查询文件是由哪个rpm包安装生成的 

[root@node01 ~]# whereis ifconfig
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
[root@node01 ~]# rpm -qf /sbin/ifconfig
net-tools-1.60-110.el6_2.x86_64
如果某rpm包尚未安装,需查询其说明信息、安装以后会生成的文件

-p /PATH/TO/PACKAGE_FILE

[root@node01 upload]# rpm -qpi jdk-7u67-linux-x64.rpm 
Name        : jdk                          Relocations: /usr/java 
Version     : 1.7.0_67                          Vendor: Oracle Corporation
Release     : fcs                           Build Date: Sat 26 Jul 2014 12:56:56 AM CST
Install Date: (not installed)               Build Host: sc14160135.us.oracle.com
Group       : Development/Tools             Source RPM: jdk-1.7.0_67-fcs.src.rpm
Size        : 206940196                        License: http://java.com/license
Signature   : (none)
Packager    : Java Software <jre-comments@java.sun.com>
URL         : URL_REF
Summary     : Java Platform Standard Edition Development Kit
[root@node01 upload]# rpm -qpl jdk-7u67-linux-x64.rpm | head -10
/etc
/etc/.java
/etc/.java/.systemPrefs
/etc/.java/.systemPrefs/.system.lock
/etc/.java/.systemPrefs/.systemRootModFile
/etc/init.d/jexec
/usr
/usr/java
/usr/java/jdk1.7.0_67
/usr/java/jdk1.7.0_67/COPYRIGHT



YUM仓库安装

基于rpm包管理
提供rpm仓库

(1)、仓库源配置

yum配置文件地址/etc/yum.repos.d/

[root@node01 upload]# cd /etc/yum.repos.d/
[root@node01 yum.repos.d]# ll
total 20
-rw-r--r--. 1 root root 1926 Nov 27  2013 CentOS-Base.repo
-rw-r--r--. 1 root root  638 Nov 27  2013 CentOS-Debuginfo.repo
-rw-r--r--. 1 root root  630 Nov 27  2013 CentOS-Media.repo
-rw-r--r--. 1 root root 3664 Nov 27  2013 CentOS-Vault.repo
-rw-r--r--  1 root root 1083 May 15  2015 epel.repo
      配置文件格式:

[repoID] 仓库id
baseurl= 支持这几种协议指定仓库源
	http://
	file://
	ftp://
gpgcheck=1/0 是否开启检查
enable=0/1 是否启用

那仓库源需要什么格式呢?

需要两个文件夹:

Packages: rpm安装包存储位置

repodata: 安装包的元数据信息,yum会先把这些元数据加载到本地,安装软件时会先到元数据里找,找到再从Packages里下载rpm包。


http协议仓库源:

    国内镜像源:

        阿里:https://opsx.alibaba.com/mirror

        网易:https://mirrors.163.com/

    使用:

       阿里云方法:直接使用阿里云准备的 .repo文件

1、备份 

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
       2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/

#CentOS 6
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
      3、yum clean all  :清除缓存

      4、yum makecache  :生成缓存

本地仓库源:

        1、备份其他源

mv ./* ./backup/

        2、新建 .repo 文件

vi local.repo
[local]
baseurl=file:///mnt
gpgcheck=0
enable=1

     baseurl指定仓库在本机的位置:

        我的仓库的是加载的iso镜像,挂载在了 /mnt 下

[root@node01 yum.repos.d]# mount /dev/cdrom /mnt
mount: block device /dev/sr0 is write-protected, mounting read-only

      3、清除缓存

[root@node01 yum.repos.d]# yum clean all
Loaded plugins: fastestmirror
Repository 'local' is missing name in configuration, using id
Cleaning repos: local
Cleaning up Everything
Cleaning up list of fastest mirrors

      4、重建缓存,加载repodata里的元数据信息

[root@node01 yum.repos.d]# yum makecache
Loaded plugins: fastestmirror
Repository 'local' is missing name in configuration, using id
Determining fastest mirrors
local                                                                                  | 4.0 kB     00:00 ... 
local/group_gz                                                                         | 216 kB     00:00 ... 
local/filelists_db                                                                     | 6.0 MB     00:00 ... 
local/primary_db                                                                       | 4.5 MB     00:00 ... 
local/other_db                                                                         | 2.8 MB     00:00 ... 
Metadata Cache Created

列出源列表:

[root@node01 yum.repos.d]# yum repolist
Loaded plugins: fastestmirror
Repository 'local' is missing name in configuration, using id
Loading mirror speeds from cached hostfile
repo id                                              repo name                                          status
local                                                local                                              6,518


(2)、使用

查询:

    list: 列出仓库里所有rpm包

yum list | more
yum list installed #列出所有已安装的包
yum list extras #列出所有已安裝但不在Yum Repository 內的软件包信息
     search: 查找

yum search packagename
     info: 包信息

[root@node01 yum.repos.d]# yum info java-1.8.0-openjdk-devel.x86_64
Loaded plugins: fastestmirror
Repository 'local' is missing name in configuration, using id
Loading mirror speeds from cached hostfile
Available Packages
Name        : java-1.8.0-openjdk-devel
Arch        : x86_64
Version     : 1.8.0.20
Release     : 3.b26.el6
Size        : 9.5 M
Repo        : local
Summary     : OpenJDK Development Environment
URL         : http://openjdk.java.net/
License     : ASL 1.1 and ASL 2.0 and GPL+ and GPLv2 and GPLv2 with exceptions and LGPL+ and LGPLv2 and
            : MPLv1.0 and MPLv1.1 and Public Domain and W3C
Description : The OpenJDK development tools.

安装:

yum install packagename

卸载:

yum remove packagename

升级:

yum update packagename

组命令:

yum grouplist
yum groupinfo GROUPNAME
yum groupinstall GROUPNAME
yum groupremove GROUPNAME
yum groupupdate GROUPNAME

     安装中文支持:

yum groupinstall "Chinese Support"

     开启中文(修改环境变量LANG):

[root@node01 yum.repos.d]# echo $LANG
en_US.UTF-8
[root@node01 yum.repos.d]# LANG=zh_CN.UTF-8

     安装 man 中文帮助文档

         1、添加 epel 仓库源,里面有 man-pages-zh-CN

                https://opsx.alibaba.com/mirror  找到 epel ,点帮助,按说明下载repo文件安装源

         2、安装中文文档

yum install man man-pages man-pages-zh-CN

相关文章:

         Linux Shell - bash(一):变量、重定向

         Linux Shell - bash(二):七步扩展、流程控制



添加新评论