首页  ·  知识 ·  基础设施
UNIXSHELL基础
网友    数据中心  编辑:德仔   图片来源:网络
一、查看自己机器上支持 Shell 种类的方法: # cat /etc/shells CODE: /bin/sh /bin/csh /
一、查看自己机器上支持 Shell 种类的方法:
# cat /etc/shells
CODE:
/bin/sh
/bin/csh
/bin/tcsh
/usr/local/bin/bash

二、SHELL基础(UNIX中的常用命令)
列出目录中的内容
ls
FreeBSD需要使用使用-G参数,才能按文件类型显示为约定的颜色
ls -G
使用长格式,更出目录中的内容
ls -l
显示一个文本文件的内容
cat <文件名>
cat -n /etc/passwd   (显示文件,并加行号)
less <文件名>
more <文件名>
复制文件cp <源文件名> <目标文件名>
文件更名或移动文件至其他目录
mv <文件名1> <文件名2>
mv <目录1><文件名> <目录2><文件名>
显示当前工作的目录
pwd
建立目录(-p 建立多级目录)
mkdir <目录名>
mkdir -p <目录1>/<目录2>
删除文件(或目录)
rm <文件名>
rm -rf <目录>
显示时间和日期
date
显示N天前的时间和日期
date -v -2d
其他格式请自己试一下,或查看手册   man date
date +%F
date "+DATE: %Y-%m-%d%nTIME: %H:%M:%S"
显示字符串
echo "hello c shell"
printf "hello c shell\n"
显示带颜色的字符串
echo -e "\e[31mRed String\e[0m"
printf   "\e[31mRed String\e[0m\n"

三、字符统计( wc )
wc 可以按单词(-w)、行数(-l)、字符(-c)进行统计
wc -w 文件名
wc -w < 文件名

四、字符匹配(*、?)
ls
ls *
ls ?
星号(*)匹配0个或0个以上的字符
问号(?)匹配1个字符
ls [a-z]*
配置以小写字母开头的文件名
ls [0-9]*
配置以数字开头的文件名
ls *[!a-z]
匹配不以小写字母结尾的文件名
echo *
相当于显示当前所有匹配的文件名
其实SHELL是经过以上转换步骤的
1、* 被当前目录下所有的文件名替换
2、显示(echo)出这些文件名
 
五、查看谁在线(who)
w
who
users
列出目前在线人名单
whoami
who am i
查看自己的登录名
id
id -p
查看自己的登录ID及登录名
uptime
显示系统运行情况
时间 系统运行时间 登录用户数 系统负载
last
显示用户最后一次的登录终端等信息
lastlogin
显示用户最后登录时间

六、管道(>、>>、|、<)
who > users (将who的输出保存到文件users)
who >> users (将show的输出追加到文件users后面)
true > access.log (清空文件)
echo '' > access.log (清空文件)
wc -l < users (统计users文件的行数)
cat users | wc -l (同上)
ps   (显示进程列表)
ps | sort (对进程列表进行排序)

七、将命令发送到后台运行 (&)
sort date > out &
nohup sort date > out & (退出当前登录,命令仍可在后台运行)
 
八、给变量赋值
a=123
b="123 ABC" (带空格的变量需要使用双引号(或单引号))
c="1234               abcd" (此处含有多个空格)
echo $a
echo $b
echo $c
echo "$c" (此处显示不会把多个空格变成一个空格)

let a=10 (赋值并显示变量值到终端)
read b (从键盘读取值,并赋给变量b)
10
echo $b

九、变量的算术运算
在sh(Bash) Shell中,只能进行两个整数间的运算,其结果仍为整数;
let命令,语法为:
let expr
例:
let 1 + 2
a=2
b=10
let $a + $b
let c=$a+$b
expr命令,例:
expr 1 + 2
$(()) 命令
d=$(( 2 + 3 ))
echo   $d
常见的算术运算符号,列举如下:
+,-,*,/,% 加,减,乘,除,取模

如果不是整数怎么办呢? 可以试试 bc 命令
[test@test]$ echo "9/2" | bc
4
[test@test]$ echo "9.5/2" | bc
4
[test@test]$ echo "9/2" | bc -l
4.50000000000000000000
[test@test]$ echo "9.5/2" | bc -l
4.75000000000000000000

九、命令的返回值(SHELL的状态返回值)
当运行一个命令后,SHELL通常会返回一个状态码,该值一般为0或者一个正值
0表示正常运行,即成功。正值一般是运行出错,不同的值是在SHELL内部或内核里面定义的。
例:
ls /
echo $? (显示上一个SHELL的状态返回值)
a=3 (赋值)
test   a = 4 (测试a是否等于4)
echo $? (显示上面测试的结果,0为真(true),正值为假(false))
 
十、简单介绍几个常用命令
1、paste
今天看到一个贴子:
如何将两行内容拼接成一行?
使用paste命令可以去除文本中的换行符。示例:
paste <文件名>
如果想把两(一个)个文件按行并在一起,可以使用
paste <文件1> <文件2>
cat 1
aa
bb
cc
cat 1 2
11
22
33
paste 1 2
aa    11
bb    22
cc    33
paste -s 1
aa    bb    cc
paste -d ' ' -s 1   (以空格为分格符, 合并文件中的行)
aa bb cc
paste -d '\0' -s 1 (不要分格符, 合并文件中的行)
aabbcc
2. 字符转换 (tr)
上例也可以使用 tr 来达到去除文件中的换行符,示例如下:
cat 1 | tr   "\012"   '\0' (把文件中的换行符转换成空NULL)
cat 1 | tr   "\012"   ','   (把文件中的换行符转换成逗号,)
cat 1 | tr   "\012"   ' '   (把文件中的换行符转换成空格)
cat 1 | tr -d "\012" (删除文件中的换行符)

3、取字符串中的某一段(cut、awk)
例:
cut -d : -f 1,7 /etc/passwd   (取passwd 文件中的第1,7两列,以冒号:为分隔符)
$ cut -d : -f 1,7 /etc/passwd
# $FreeBSD
#
root:/bin/csh
toor:
daemon:/usr/sbin/nologin
operator:/usr/sbin/nologin
bin:/usr/sbin/nologin
tty:/usr/sbin/nologin
...
who | cut -c 1-16 (输出当前系统的登录用户名,按字符取1-16位)
$ who | cut -c 1-16
patli
levopat
root
cut -d : -f 1-3 /etc/passwd   (取passwd 文件中的第1-3列,以冒号:为分隔符)
$ cut -d : -f 1-3 /etc/passwd
# $FreeBSD: src/etc/master.passwd,v 1.40 2005/06/06 20:19
#
root:*:0
toor:*:0
daemon:*:1
operator:*:2
bin:*:3
tty:*:4
下面介绍awk 实现与上面相似的功能:
awk -F: '{print $1}' /etc/passwd
awk -F: '{print $1,$7}' /etc/passwd
awk -F: '{print $1":"$7}' /etc/passwd
awk -F: '{print $1"|"$7}' /etc/passwd
awk -F: '{print $1,$NF}' /etc/passwd   ($NF 为最后一列的值)
以上几个命令,请大家自选测试,理解输出的结果值。

4、在文本文件中查找某个字符串(grep)
语法:
       grep [选项] 模式 [文件名...]
示例:
        $ grep root /etc/passwd (在passwd 中查找并返回带root的行)
root:*:0:0:Charlie &:/root:/bin/csh
       toor:*:0:0:Bourne-again Superuser:/root:
       daemon:*:1:1:Owner of many system processes:/root:/usr/sbin/nologin

        grep -n root /etc/passwd (在passwd 中查找并返回带root的行,并显示行号)
3:root:*:0:0:Charlie &:/root:/bin/csh
       4:toor:*:0:0:Bourne-again Superuser:/root:
      5:daemon:*:1:1:Owner of many system processes:/root:/usr/sbin/nologin

       $ grep -l root /etc/*    在/etc目录中查找并返回带root的文件名)
/etc/passwd

       grep -v root /etc/passwd (在passwd 中查找并返回不带root的行)
# $FreeBSD: src/etc/master.passwd,v 1.40 2005/06/06 20:19:56 brooks Exp $
      #
      operator:*:2:5:System &:/:/usr/sbin/nologin
       bin:*:3:7:Binaries Commands and Source:/:/usr/sbin/nologin
        tty:*:4:65533:Tty Sandbox:/:/usr/sbin/nologin
       kmem:*:5:65533:KMem Sandbox:/:/usr/sbin/nologin
       games:*:7:13:Games pseudo-user:/usr/games:/usr/sbin/nologin
...
$ grep -R ifconfig /etc/*   (-R 表示也在子目录中查找)
/etc/devd.conf: action "ifconfig $device-name inet 1.2.3.4 netmask 0xffff0000";
       grep: /etc/nsmb.conf: Permission denied
      /etc/rc.conf:ifconfig_em0="inet 61.12.166.19 netmask 255.255.255.240"
补充: grep 的一些常用选项的含义
      -c 只是输出一些匹配行的计数
      -i 不区别大小写
      -l 输出包含匹配的字符文件名
     -n 显示匹配的行号
     -v 显示不包含匹配的文本所有行
     -s 不显示不存在或无匹配文本的错误信息
    以下使用 awk 实现类似上面的功能

     $awk '/root/' /etc/passwd
root:*:0:0:Charlie &:/root:/bin/csh
      toor:*:0:0:Bourne-again Superuser:/root:
     daemon:*:1:1:Owner of many system processes:/root:/usr/sbin/nologin

$ awk '/root/{print NR ":" $0}' /etc/passwd
3:root:*:0:0:Charlie &:/root:/bin/csh
      4:toor:*:0:0:Bourne-again Superuser:/root:
      5:daemon:*:1:1:Owner of many system processes:/root:/usr/sbin/nologin
      26:wwwroot:*:3000:3000:User &:/www/vhost/wwwroot:/usr/sbin/nologin
以下使用 sed 实现类似上面的功能
$sed -n '/root/p' /etc/passwd
root:*:0:0:Charlie &:/root:/bin/csh
       toor:*:0:0:Bourne-again Superuser:/root:
      daemon:*:1:1:Owner of many system processes:/root:/usr/sbin/nologin

九、变量的算术运算
[test@test]$ echo "9/2" | bc
4
[test@test]$ echo "9.5/2" | bc
4
[test@test]$ echo "9/2" | bc -l
4.50000000000000000000
[test@test]$ echo "9.5/2" | bc -l
4.75000000000000000000
 
本文作者:网友 来源:网络
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读
也许感兴趣的
我们推荐的
主题最新
看看其它的