一、查看自己机器上支持 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