日志统计常用手法:
awk '{print $1}' |sort -n |uniq -c |sort -nr|head -10
找第一列中,排序,再统计每种多少,排序反序,再取前10名。
ifconfig ens33 |grep -i "^.*inet "|sed 's/^.*inet //g' |sed 's/ *netmask.*$//g'
切出ip地址
awk 'NR==2 {print $0}'
取出第五行
awk -F ":" 'NR<3 {print $0}'
只打出前两行
awk -F ":" 'NR!=3 {print $0}'
除第三行外其它显示,
<= == >= < > 等运算符
awk 'NR==2,NR==4 {print $0}'
取第2-4行
awk '{print NR,$0}'
每一行开头增加序列号
awk '{print $(NF-0)}'
最后一列
awk -F ":" '{print $1,$NF}'
取第一和最后一列
ifconfig ens33 |awk 'NR==2{print $2}'
取ip地址
awk -F ":" '{print $1,"----------",$2}'
第一列和第二列中间加-------
awk -F ":" -v OFS="-------" '{print $1,$2}'
第一列和第二列中间加-------
awk -F ":" ' {print NR,NF,$1}'
NR第一列显示序号,第二列显示每行有几列NF,输出第一列
NR第一列显示序号,第二列显示每行有几列NF,输出第一列
awk -F ":" 'BEGIN{print "序号"} {print NR,NF,$1}
打印前先输出第一行为:序号两个字
cat passwd |awk -F ":" 'BEGIN{printf "%-25s\t %-25s\t %-25s\n", "用户名","密码","UID"} {printf "%-25s\t %-25s\t %-25s\n",$1,$2,$3}'
输出如下:
用户名 密码 UID
root x 0
bin x 1
daemon x 2
adm x 3
lp x 4
sync x 5
shutdown x 6
halt x 7
awk -F ":" 'BEGIN{print "开始第一行"} {print NR,NF,$1} END{print "最后一行"}'
开始加一行,最后完了再加一行
awk '/^root/{print $0}'
以rott开头的显示出来
awk '/\/sbin\/nologin$/{print $0}'
以nologing结束的显示出来,\为转义符
[root@client ~]# name="yeng"
[root@client ~]# cat passwd |awk -v myname=$name -F ":" 'BEGIN{print myname} {print NR,NF,$1}'
把变量代入
sed -i '1i\要添加的内容'
第一行前面加入一行
sed -i '/server/s/^/&#/g'
找到开头是server的行,加上注释#,把server这行注释掉
sed -n '5,7p'
只显示5-7行,如果是d就是删除
cat pass |sed '1a 第一行\n第二行?'
从第一行开始加入两行
cat pass |sed 's/#.*$/#######/g'
把有#号注释的行给改成########
sed -i '$a ydaxia' pass
最后一行下面加入ydaixa
sed -i 's/\.$/\!/g'
最后一个点都改成!
直接改那一行的内容SELINUX=enforcing 改成SELINUX=disabled
sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
sed -i 's:/tmp:/tmp/abc/:g'
test.txt意思是将/tmp改成/tmp/abc/。
统计 Nginx 访问日志 访问量排在前20的ip地址
cat access.log |awk '{print $1}'|sort|uniq -c |sort -nr |head -20
修改文本中以ab 结尾的替换成 cd
sed -e 's/ab$/cd/g' b.txt
shebang这个词其实是两个字符名称的组合。在Unix的行话里,用sharp或hash(有时候是mesh)
来称呼字符“#”,用bang来称呼惊叹号“!”,因而shebang合起来就代表了这两个字符。
要打印彩色文本,可输入如下命令:
echo -e "\e[1;31m This is red text \e[0m"
\e[1;31将颜色设为红色,\e[0m将颜色重新置回。只需要将31替换成想要的颜色码就可以了。
要设置彩色背景,经常使用的颜色码是:重置=0,黑色=40,红色=41,绿色=42,黄色=43,
蓝色=44,洋红=45,青色=46,白色=47。
要打印彩色文本,可输入如下命令:
echo -e "\e[1;42m Green Background \e[0m"
系统环境变量添加
$ PATH="$PATH:/home/user/bin"
$ export PATH
$ echo $PATH
/home/slynux/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr
/games:/home/user/bin
这样,我们就将/home/user/bin添加到了PATH中。
获取字符串长度:
var=12345678901234567890$
echo ${#var}
输出:20
获取当前的shell:
echo $0
检查用户是否为管理员(直接id命令也可以看出来)
If [ $UID -ne 0 ]; then
echo Non root user. Please run as root.
else
echo Root user
fi
root用户的UID是0。
算术运算用(())或expr或bc
a=2
b=4
echo $((a+b))
expr也可以计算,也可以用于判断变量输入的是不是整数,如果不是计算出错返为不为0
expr $a + $b
echo "4 * 0.56" | bc
2.24
数组
array_var=(1 2 3 4 5 6)
echo ${array_var[0]}进行切片
echo ${array_var[@]}全部打印出来
echo ${#array_var[*]}计算数组长度
判断:
[ -f $file_var ]:如果给定的变量包含正常的文件路径或文件名,则返回真。
[ -x $var ]:如果给定的变量包含的文件可执行,则返回真。
[ -d $var ]:如果给定的变量包含的是目录,则返回真。
[ -e $var ]:如果给定的变量包含的文件存在,则返回真。
[ -c $var ]:如果给定的变量包含的是一个字符设备文件的路径,则返回真。
[ -b $var ]:如果给定的变量包含的是一个块设备文件的路径,则返回真。
[ -w $var ]:如果给定的变量包含的文件可写,则返回真。
[ -r $var ]:如果给定的变量包含的文件可读,则返回真。
[ -L $var ]:如果给定的变量包含的是一个符号链接,则返回真。
使用方法如下:
fpath="/etc/passwd"
if [ -e $fpath ]; then
echo File exists;
else
echo Does not exist;
fi
字符串比较
使用字符串比较时,最好用双中括号,因为有时候采用单个中括号会产生错误,所以最
好避开它们
可以用下面的方法检查两个字符串,看看它们是否相同。
[[ $str1 = $str2 ]]:当str1等于str2时,返回真。也就是说,str1和str2包含
的文本是一模一样的。
[[ $str1 == $str2 ]]:这是检查字符串是否相等的另一种写法。
也可以检查两个字符串是否不同。
[[ $str1 != $str2 ]]:如果str1和str2不相同,则返回真。
我们还可以检查字符串的字母序情况,具体如下所示。
[[ $str1 > $str2 ]]:如果str1的字母序比str2大,则返回真。
[[ $str1 < $str2 ]]:如果str1的字母序比str2小,则返回真。
[[ -z $str1 ]]:如果str1包含的是空字符串,则返回真。
[[ -n $str1 ]]:如果str1包含的是非空字符串,则返回真。
例如:
str1="Not empty "
str2=""
if [[ -n $str1 ]] && [[ -z $str2 ]];
then
echo str1 is nonempty and str2 is empty string.
fi
输出如下:
str1 is nonempty and str2 is empty string.
使用cat命令的-n选项会在输出的每一行内容之前加上行号
cat -n lines.txt
查看网卡是100M还是1000M
ethtool eth0
find用法
find . \( -name "*.txt" -o -name "*.pdf" \) -print
find . ! -name "*.txt" -print
上面的find命令能够匹配所有不以.txt结尾的文件名
find . -maxdepth 1 -name "f*" -print
该命令列出当前目录下的所有文件名以f打头的文件。即使有子目录,
也不会被打印或遍历。与之类似,-maxdepth 2最多向下遍历两级子目录。
按文件类型来搜:
普通文件 f
符号链接 l
目录 d
字符设备 c
块设备 b
套接字 s
FIFO p
只列出所有的目录:
$ find . -type d -print
只列出普通文件:
$ find . -type f -print
只列出符号链接:
$ find . -type l -print
-atime、-mtime、-ctime可作为find的时间选项。它们可以用整数值指定,单位是天。
这些整数值通常还带有 - 或 + :- 表示小于,+ 表示大于。
打印出在最近7天内被访问过的所有文件:
$ find . -type f -atime -7 -print
打印出恰好在7天前被访问过的所有文件:
$ find . -type f -atime 7 -print
打印出访问时间超过7天的所有文件:
$ find . -type f -atime +7 -print
-atime、-mtime以及-ctime都是基于时间的参数,其计量单位是“天”。还有其他一些基
于时间的参数是以分钟作为计量单位的。这些参数包括:
-amin(访问时间);
-mmin(修改时间);
-cmin(变化时间)。
根据文件的大小,可以这样搜索:
$ find . -type f -size +2k
# 大于2KB的文件
$ find . -type f -size -2k
# 小于2KB的文件
$ find . -type f -size 2k
大小等于2KB的文件
除了k之外,还可以用其他文件大小单元。
b —— 块(512字节)。
c —— 字节。
w —— 字(2字节)。
k —— 1024字节。
M —— 1024K字节。
G —— 1024M字节。
删除当前目录下所有的 .swp文件:
$ find . -type f -name "*.swp" -delete
也可以根据文件权限进行文件匹配。列出具有特定权限的所有文件:
$ find . -type f -perm 644 -print
查文件权限是不是为644
$ find . -type f -name "*.php" ! -perm 644 -print
打印出用户slynux拥有的所有文件:
$ find . -type f -user slynux -print
find带执行:
find . -type f -user root -exec chown slynux {} \;
在这个命令中,{}是一个与 -exec选项搭配使用的特殊字符串。对于每一个匹配的文件,
{}会被替换成相应的文件名。例如,find命令找到两个文件test1.txt和test2.txt,
其所有者均为slynux,那么find就会执行:
chown slynux {}
它会被解析为chown slynux test1.txt和chown slynux test2.txt。
另一个例子是将给定目录中的所有C程序文件拼接起来写入单个文件all_c_files.txt。
我们可以用find找到所有的C文件,然后结合 -exec使用cat命令:
$ find . -type f -name "*.c" -exec cat {} \;>all_c_files.txt
-exec之后可以接任何命令。{}表示一个匹配。对于任何匹配的文件名,{}均会被该文件名
所替换。我们使用 >操作符将来自find的数据重定向到all_c_files.txt文件,没有使用>>
(追加)的原因是因为find命令的全部输出就只有一个数据流(stdin),
而只有当多个数据流被追加到单个文件中时才有必要使用>>
例如,用下列命令将10天前的 .txt文件复制到OLD目录中:
$ find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD \;
当前一级目录下所有的普通文件结尾为.sh的全啊移动到shells文件中
find . -maxdepth 1 -type f -name "*.sh" -exec mv {} /root/shells/ \;
-exec结合多个命令
我们无法在-exec参数中直接使用多个命令。它只能够接受单个命令,不过
我们可以耍一个小花招。把多个命令写到一个shell脚本中(例如command.sh),然
后在-exec中使用这个脚本:
-exec ./commands.sh {} \;
xargs用法
结合find使用xargs
xargs和find算是一对死党。两者结合使用可以让任务变得更轻松。不过人们通常却是以一
种错误的组合方式使用它们。
例如:$ find . -type f -name "*.txt" -print | xargs rm -f
这样做很危险。有时可能会删除不必要删除的文件。我们没法预测分隔find命令输出结果
的定界符究竟是什么('\n'或者' ')。很多文件名中都可能会包含空格符(' '),
因此xargs
很可能会误认为它们是定界符(例如,hell text.txt会被xargs误解为hell和text.txt)。
只要我们把find的输出作为xargs的输入,就必须将 -print0与find结合使用,以字符null
('\0')来分隔输出。
用find匹配并列出所有的 .txt文件,然后用xargs将这些文件删除:
$ find . -type f -name "*.txt" -print0 | xargs -0 rm -f
这样就可以删除所有的.txt文件。xargs -0将\0作为输入定界符。
$ cat example.txt # 样例文件
1 2 3 4 5 6
7 8 9 10
11 12
$ cat example.txt | xargs
1 2 3 4 5 6 7 8 9 10 11 12
指定字符分隔
echo "splitXsplitXsplitXsplit" | xargs -d X
split split split split
用find匹配并列出所有的 .txt文件,然后用xargs将这些文件删除(类似遍历删除非常棒):
$ find . -type f -name "*.txt" -print0 | xargs -0 rm -f
这样就可以删除所有的.txt文件。xargs -0将\0作为输入定界符
tr命令
(1) 移除 '\n' 和 '\t':
tr -d '\n\t'
删除换行
tr -d '\n'
大小写转换
echo "HELLO WHO IS THIS" | tr 'A-Z' 'a-z'
$ echo "Hello 123 world 456" | tr -d '0-9'
Hello world
# 将stdin中的数字删除并打印出来
除去空格输出,非常实用
echo "GNU is not UNIX. Recursive right ?" | tr -s ' '
GNU is not UNIX. Recursive right ?
还可以像下面这样使用tr,以摈除多余的换行符:
$ cat multi_blanks.txt | tr -s '\n'
tr可以像使用集合一样使用各种不同的字符类,这些字符类如下所示:
alnum:字母和数字。
alpha:字母。
cntrl:控制(非打印)字符。
digit:数字。
graph:图形字符。
lower:小写字母。
print:可打印字符。
punct:标点符号。
space:空白字符。
upper:大写字母。
xdigit:十六进制字符
例如:
tr '[:lower:]' '[:upper:]'
为了计算md5sum,使用下列命令:
$ md5sum filename
68b329da9893e34099c7d8ad5cb9c940 filename
如上所示,md5sum是一个32个字符的十六进制串。
将输出的校验和重定向到一个文件,然后用这个MD5文件核实数据的完整性:
$ md5sum filename > file_sum.md5
可以按照下面的方法用生成的文件核实数据完整性:
$ md5sum -c file_sum.md5
# 这个命令会输出校验和是否匹配的消息
sort用法
-k指定了排序应该按照哪一个键(key)来进行。键指的是列号,而列号就是执行排序时的
依据。-r告诉sort命令按照逆序进行排序。例如:
# 依据第1列,以逆序形式排序
$ sort -nrk 1 data.txt
4 linux 1000
3 bsd 1000
2 winxp 4000
1 mac 2000
# -nr表明按照数字,采用逆序形式排序
# 依据第2列进行排序
$ sort -k 2 data.txt
3 bsd 1000
4 linux 1000
1 mac 2000
2 winxp 4000
一定要留意用于按数字顺序进行排序的选项-n。sort命令对于字母表排序
和数字排序有不同的处理方式。因此,如果要采用数字顺序排序,就应该明确
地给出-n选项
$ sort -nk 2,3 data.txt
把醒目的字符作为数值键。为了提取这个键,用字符在行内的起止位置作为键的书写格式
(在上面的例子中,起止位置是2和3)。
用第一个字符作为键:
$ sort -nk 1,1 data.txt
uniq
要统计各行在文件中出现的次数,使用下面的命令:
$ sort unsorted.txt | uniq -c
1 bash
1 foss
2 hack
找出文件中重复的行:
$ sort unsorted.txt | uniq -d
这个对比键被用作uniq操作的索引:
$ cat data.txt
u:01:gnu
d:04:linux
u:01:bash
u:01:hack
我们需要使用醒目的字符作为唯一的键。可以通过忽略前2个字符(-s 2),
使用 -w选项(-w 2)指定用于比较的最大字符数。
$ sort data.txt | uniq -s 2 -w 2
d:04:linux
u:01:bash
自动在tmp目录下创建一个随机文件
mktemp -d
split用法
假设有一个叫做data.file的测试文件,其大小为100KB。你可以将该文件分割成多个大小为
10KB的文件,方法如下:
$ split -b 10k data.file
$ ls
data.file xaa xab xac xad xae xaf xag xah xai xaj
上面的命令将data.file分割成多个文件,每一个文件大小为10KB
我们加上文件名前缀再运行先前那个命令来分割文件:
$ split -b 10k data.file -d -a 4 split_file
$ ls
data.file split_file0002 split_file0005 split_file0008 strtok.c
split_file0000 split_file0003 split_file0006 split_file0009
split_file0001 split_file0004 split_file0007
如果不想按照数据块大小,而是需要根据行数来分割文件的话,
可以使用 -l no_of_lines:
$ split -l 10 data.file
# 分割成多个文件,每个文件包含10行
rename用法
将 *.JPG更名为 *.jpg:
$ rename *.JPG *.jpg
将文件名中的空格替换成字符“_”:
$ rename 's/ /_/g' *
转换文件名的大小写:
$ rename 'y/A-Z/a-z/' *
$ rename 'y/a-z/A-Z/' *
将所有的 .mp3文件移入给定的目录:
$ find path -type f -name "*.mp3" -exec mv {} target_dir \;
将所有文件名中的空格替换为字符“_”:
$ find path -type f -exec rename 's/ /_/g' {} \;
$ dd if=/dev/zero of=junk.data bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.00767266 s, 137 MB/s
该命令会创建一个1MB大小的文件junk.data。来看一下命令参数:if代表输入文件(input file),
of代表输出文件(output file),bs代表以字节为单位的块大小(block size),count代表需要被
复制的块数。
2. 设置粘滞位
粘滞位是一种应用于目录的权限类型。通过设置粘滞位,使得只有目录的所有者才能够删除
目录中的文件,即使用户组和其他用户拥有足够的权限也不能执行删除操作。
要设置粘滞位,利用chmod将 +t应用于目录:
$ chmod a+t directory_name
把光盘文件下载的本地并成为iso格式
用下面的命令从/dev/cdrom创建一个ISO镜像:
# cat /dev/cdrom > image.iso
尽管可以奏效。但创建ISO镜像最好的方法还是使用dd工具:
# dd if=/dev/cdrom of=image.iso
刻录光盘
其中选项 -o指定了ISO文件的路径。source_dir是作为ISO文件内容来源的目录路径,
选项 -V指定了ISO文件的卷标。
mkisofs -V "Label" -o image.iso source_dir/
挂截下载好的iso文件:
3. 将ISO文件作为环回文件挂载
ISO文件是光学存储介质的归档。我们可以采用挂载环回文件的方法,像挂载物理光盘一样
挂载ISO文件。
我们甚至可以用一个非空目录作为挂载路径。那么在设备被卸载之前,这个挂载路径中包含
的都是来自该设备的数据,而非目录中的原始内容。例如:
# mkdir /mnt/iso
# mount -o loop linux.iso /mnt/iso
现在就可以用/mnt/iso中的文件进行操作了。ISO是一个只读文件系统。
当对挂载设备作出更改之后,这些改变并不会被立即写入物理设备。只有当缓冲区被写满之
后才会进行设备回写。但是我们可以用sync命令强制将更改即刻写入:
diff用法
diff -u version1.txt version2.txt
选项-u用于生成一体化输出。因为一体化输出的可读性更好,更易于看出两个文件
之间的差异,所以人们往往更喜欢这种输出形式。
在一体化diff输出中,以 + 起始的是新加入的行,以 - 起始的是删除的行。
修补文件可以通过将diff的输出重定向到一个文件来生成:
$ diff -u version1.txt version2.txt > version.patch
现在就可以用patch命令将修改应用于任意文件。当应用于version1.txt时,我们就可
以得到version2.txt;而当应用于version2.txt时,就可以得到version1.txt。
(5) 用下列命令来进行修补:
$ patch -p1 version1.txt < version.patch
patching file version1.txt
version1.txt的内容现在和verson2.txt的内容一模一样。
$ patch -p1 version1.txt < version.patch
patching file version1.txt
Reversed (or previously applied) patch detected! Assume -R? [n] y
# 修改被撤销
如上例所示,修补已修补的文件将撤销修改。
在撤销修改时,若使用patch命令的 -R选项,则不会提示用户y/n。
head用法
3) 指定打印前几行:
$ head -n 4 file
该命令会打印文件的前4行。
例如,用下面的代码打印除了最后5行之外的所有行:
$ seq 11 | head -n -5
tail用法:
打印最后5行:
$ tail -n 5 file
$ seq 100 | tail -n +6
这条命令将打印出第6行至最后一行。
你可能希望将其用于日志文件。监视文件内容增加的命令如下:
# tail -f /var/log/messages
保存多个临时目当用于快速切换:
使用pushd和popd时,可以无视cd命令。
(1) 压入并切换路径:
~ $ pushd /var/www
现在,栈中包含了 /var/www ~,当前目录切换到 /var/www。
(2) 再压入下一个目录路径:
/var/www $ pushd /usr/src
现在栈中包含 /usr/src /var/www ~,当前目录为 /usr/src。
(3) 用下面的命令查看栈内容:
$ dirs
/usr/src /var/www ~ /usr/share /etc
0 1 2 3
当你想切换到列表中任意一个路径时,将每条路径从0到n进行编号,然后使用你希
望切换到的路径编号,例如:
$ pushd +3
这条命令会将栈进行翻转并切换到目录 /use/share
5) 要删除最后添加的路径并把当前目录更改为上一级目录,可以使用以下命令:
$ popd
假设现在栈包含 /usr/src /var/www ~ /usr/share /etc,当前目录是 /usr/share,
popd会将栈更改为 /var/www ~ /usr/share /etc,并且把目录切换到/var/www。
(6) 用popd +num可以从列表中移除特定的路径。
num是从左到右,从0到n开始计数的。
匹配网站
$ egrep -o "http://[a-zA-Z0-9.]+\.[a-zA-Z]{2,3}" url_email.txt
http://www.google.com
http://code.google.com
匹配email格式
$ egrep -o '[A-Za-z0-9._]+@[A-Za-z0-9.]+\.[a-zA-Z]{2,4}' url_email.txt
slynux@slynux.com
test@yahoo.com
cool.hacks@gmail.com
匹配ip地址格式
egrep -w "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
grep命令只解释match_text中的某些特殊字符。如果要使用正则表达式,需要添
加-E选项——这意味着使用扩展(extended)正则表达式。或者也可以使用默认允
许正则表达式的grep命令——egrep
只输出文件中匹配到的文本部分,可以使用选项 -o:
$ echo this is a line. | egrep -o "[a-z]+\."
line.
需要注意的是-c只是统计匹配行的数量,并不是匹配的次数。例如:
$ echo -e "1 2 3 4\nhello\n5 6" | egrep -c "[0-9]"
2
搜索多个文件并找出匹配文本位于哪一个文件中:
$ grep -l linux sample1.txt sample2.txt
sample1.txt
sample2.txt
cut用法
$ cut -f 2,3 filename
这条命令将显示第2列和第3列(必须是tab制表符分开的列才可以,要指定字段的定界符,
使用 -d选项:例以分号分隔:)
cut -f 2 -d ";" delimited_data.txt
你希望打印出除第3列之外的所有列,则可以使用:
$ cut -f3 --complement student_data.txt
你可以打印第1个到第5个字符:
cut -c 1-5 range_fields.txt
abcde
abcde
abcde
abcde
打印前2个字符:
$ cut range_fields.txt -c -2
ab
ab
ab
ab
sed用法
以下是可以用于awk的一些特殊变量。
NR:表示记录数量,在执行过程中对应于当前行号。
NF:表示字段数量,在执行过程中对应于当前行的字段数。
$0:这个变量包含执行过程中当前行的文本内容。
$1:这个变量包含第一个字段的文本内容。
$2:这个变量包含第二个字段的文本内容。
我们可以用print $NF打印一行中最后一个字段,用 $(NF-1)打印倒数第二个字段,其他
字段依次类推即可。
要统计文件中的行数,使用下面的命令:
$ awk 'END{ print NR }' file
用sed移除空白行不过是小菜一碟。空白行可以用正则表达式 ^$ 进行匹配:
$ sed '/^$/d' file
我们的目标是移除包含“mobile phones”的句子。可以用下面的sed语句来实现:
$ sed 's/ [^.]*mobile phones[^.]*\.//g' sentence.txt
sed –i .bak 's/abc/def/' file
这时的sed不仅执行文件内容替换,还会创建一个名为file.bak的文件,其中
包含着原始文件内容的副本。
(2) 移除多余的空格:
tr -s ' '或者sed 's/[ ]\+/ /g'
(3) 移除注释:
sed 's:/\*.*\*/::g'
awk用法
awk 'BEGIN { i=0 } { i++ } END{ print i}' filename
$ echo -e "line1\nline2" | awk 'BEGIN{ print "Start" } { print } END{ print "End" } '
Start
line1
line2
End
(1) 要打印出从M行到N行这个范围内的所有文本,使用下面的语法:
$ awk 'NR==M, NR==N' filename
也可以用stdin作为输入:
$ cat filename | awk 'NR==M, NR==N'
paste用法
拼接两个文件中列
默认的定界符是制表符,也可以用 -d明确指定定界符,例如:
$ paste file1.txt file2.txt -d ","
1,slynux
2,gnu
3,bash
4,hack
tac用法
逆序查看并打印
$ seq 5 | tac
5
4
3
2
1
wet用法
wget --limit-rate 20k http://example.com/file.iso
一些网页需要HTTP或FTP认证,可以用--user和--password提供认证信息:
$ wget --user username --password pass URL
也可以不在命令行中指定密码,而由网页提示并手动输入密码,这就需要将--password改
为--ask-password。
curl用法
要避免curl命令显示进度信息,可以使用--silent选项:
$ curl URL --silent
选项 –O表明将下载数据写入文件,而非标准输出中。该文件采用的是从URL中解析出的
文件名:
curl URL --silent -o new_filename
如果带宽有限,又有多个用户共享,为了平稳流畅地分享带宽,我们可以用--limit-rate
限制cURL的下载速度:
$ curl URL --limit-rate 20k
-u username:password可用来指定用户名和密码。它也可以不指定密码,而在后续的执
行过程中按照提示输入密码。例如:
$ curl -u user:pass http://test_auth.com
tar用法
(1) 用tar对文件进行归档:
$ tar -cf output.tar [SOURCES]
例如:
$ tar -cf output.tar file1 file2 file3 folder1 ..
(2) 使用选项-t列出归档文件中所包含的文件:
$ tar -tf archive.tar
file1
file2
有时候,我们可能需要向已存在的归档文件再添加一些文件,这时可以使用追加选项-r。
要向已有的归档文件中添加一个文件:
$ tar -rvf original.tar new_file
当通过安全shell(Secure Shell,SSH)连接传输数据时,这招很管用。例如:
$ tar cvf - files/ | ssh user@example.com "tar xv -C Documents/"
在上面的例子中,对files目录中的内容进行了归档并输出到stdout(由'-'指明)。
4. 拼接两个归档文件
我们可以用 -A选项轻松地合并多个tar文件。
假设我们现在有两个tar文件:file1.tar和file2.tar。
可以按照下面的方法将file2.tar的内容合并到file1.tar中:
$ tar -Af file1.tar file2.tar
查看内容,验证操作是否成功:
$ tar -tvf file1.tar
5. 通过检查时间戳来更新归档文件中的内容
增量压缩
添加选项可以将指定的任意文件加入到归档文件中。如果同名文件已经存在,那么结果就是
在归档文件中包含了两个同名的文件。我们可以用更新选项-u指明:只有比归档文件中的同名文
件更新时才会被添加。
$ tar -tf archive.tar
filea
fileb
filec
上面的命令将列出归档文件中的内容。
仅当filea自上次被加入archive.tar后出现了变动才对其进行追加,可以使用:
$ tar -uf archive.tar filea
如果两个filea的时间戳相同,则什么都不会发生。
压缩tar包
$ gzip archive.tar
如果有大量文件(上百个)需要归档及压缩,我们可以采用方法2,并稍作变动。将多个文
件作为命令行参数传递给tar的问题在于:tar只能从命令行中接受有限个文件。
要解决这个问题,我们可以在循环中使用追加选项(-r)来逐个添加文件:
FILE_LIST="file1 file2 file3 file4 file5"
for f in $FILE_LIST;
do
tar -rvf archive.tar $f
done
gzip archive.tar
zip压缩
(1) 对归档文件采用ZIP格式进行压缩:
$ zip archive_name.zip [SOURCE FILES/DIRS]
例如:
$ zip file.zip file
该命令会生成file.zip。
(2) 对目录和文件进行递归操作:
$ zip -r archive.zip folder1 folder2
其中,-r用于指定递归操作。
(1) 如果需要更新压缩文件中的内容,使用选项 -u:
$ zip file.zip -u newfile
(2) 从压缩文件中删除内容,则使用-d:
$ zip -d arc.zip file.txt
(3) 列出压缩文件中的内容:
$ unzip -l archive.zip
rsync用法
$ rsync -av /home/slynux/data slynux@192.168.0.6:/home/backups/data
其中:
-a表示要进行归档;
-v表示在stdout上打印出细节信息或进度。
-z压缩传输
(2) 将数据备份到远程服务器或主机:
$ rsync -avz source_dir username@host:PATH
如果需要在目的端建立一份镜像,只需要定期运行同样的rsync命令即可。它只会
对更改过的文件进行复制。
(3) 用下面的方法将远程主机上的数据恢复到本地主机:
$ rsync -avz username@host:PATH destination
如果在destination_path末尾使用/,那么rsync会将来自源
端的内容复制到目的端目录中。
如果没有使用/,rsync会在目的端路径尾部创建一个同名目录,
然后将源端内容复制到这个目录中。
可以通过通配符指定需要排除的文件。例如:
$ rsync -avz /home/code/some_code /mnt/disk/backup/code --exclude "*.txt"
该命令不对.txt文件进行备份。
3. 定期进行备份
你可以创建一个cron任务来定期进行备份。
下面是一个简单的例子:
$ crontab -ev
添加上这么一行:
0 */10 * * * rsync -avz /home/code user@IP_ADDRESS:/home/backups
上面的crontab条目将rsync调度为每10个小时运行一次。
host用法
当执行host时,它会列出某个域名所有的IP地址。nslookup类似于host命令,它用于查询
DNS相关的细节信息以及名字解析。例如:
$ host google.com
scp用法
$ scp filename user@remotehost:/home/path
5. 用SCP进行递归复制
使用scp的 -r选项,我们可以在两台网络主机之间对文件夹进行递归复制:
$ scp -r /home/slynux user@remotehost:/home/backups
# 将目录/home/slynux递归复制到远程主机中
scp的 -p选项能够在复制文件的同时保留文件的权限和模式。
如果你只是想设置端口转发,而不希望总是保持一个打开状态的shell,那么可以像下面这样
使用ssh:
ssh -fL 8000:www.kernel.org:80 user@localhost -N
-f指定ssh在执行命令前转入后台运行,-L指定远程主机的登录名,-N告诉ssh无需执行命令,
只进行端口转发。
2. 反向端口转发
反向端口转发是SSH最强大的特性之一。如果你有一台无法通过互联网进行访问的主机,但
是又希望其他用户可以访问到这台主机上的服务,那就是反向端口转发大显身手的时候了。如果
你使用SSH访问一台可以通过互联网访问的远程主机,那么就可以在这台主机上设置反向端口转
发,将流量转发到运行服务的本地主机上。
反向端口转发的设置同端口转发非常类似:ssh -R 8000:localhost:80 user@REMOTE_MACHINE
上述命令会将远程主机端口8000上的流量转发到本地主机的端口80上。和之前一样,别忘了把
REMOTE_MACHINE替换成远程主机的主机名或IP地址。
利用这种方法,如果你在远程主机上浏览http://localhost,那么实际连接的是运行在本地主机
端口8000上的Web服务器。
du使用
按占用多少空间默认为字节递归加-a
du -h file.txt
列出当前目录所有文件最大容量的文件,目录除外
shells]# find ./ -type f -exec du -ah {} \; |sort -nr |head -1
统计命令执行的时间
$ time ls
test.txt
next.txt
real 0m0.008s
user 0m0.001s
sys 0m0.003s
输出中分别显示了执行该命令所花费的real时间、user时间以及sys时间
列出当前登录主机的用户列表:
$ users
slynux slynux slynux hacker
获取失败的用户登录会话信息:
# lastb
日志轮替logrotate用法:
我们可以为自己的日志文件(比如/var/log/program.log)编写一个特定的配置:
$ cat /etc/logrotate.d/program
/var/log/program.log {
missingok
notifempty
size 30k
compress
weekly
rotate 5
create 0600 root root
}
missingok 如果日志文件丢失,则忽略;然后返回(不对日志文件进行轮替)
notifempty 仅当源日志文件非空时才对其进行轮替
size 30k 限制实施轮替的日志文件的大小。可以用1M表示1MB
compress 允许用gzip压缩较旧的日志
weekly 指定进行轮替的时间间隔。可以是weekly、yearly或daily
rotate 5 这是需要保留的旧日志文件的归档数量。在这里指定的是5,所以这些文件名
将会是program.log.1.gz、program.log.2.gz等直到program.log.5.gz
create 0600 root root 指定所要创建的归档文件的模式、用户以及用户组
各日志代表的程序
/var/log/boot.log 系统启动信息
/var/log/httpd Apache Web服务器日志
/var/log/messages 发布内核启动信息
/var/log/auth.log 用户认证日志
/var/log/dmesg 系统启动信息
/var/log/mail.log 邮件服务器日志
/var/log/Xorg.0.log X服务器日志
查看cpu占用
示例如下,其中comm表示COMMAND,pcpu表示CPU占用率:
$ ps -eo comm,pcpu | head
COMMAND %CPU
init 0.0
kthreadd 0.0
migration/0 0.0
ksoftirqd/0 0.0
watchdog/0 0.0
events/0 0.0
cpuset 0.0
khelper 0.0
netns 0.0
选项-o可以使用不同的参数,这些参数及其描述如表9-1所示
pcpu CPU占用率
pid 进程ID
ppid 父进程ID
pmem 内存使用率
comm 可执行文件名
cmd 简单命令①
user 启动进程的用户
nice 优先级
time 累计的CPU时间
etime 进程启动后流逝的时间
tty 所关联的TTY设备
euid 有效用户ID
stat 进程状态
```bash
$$
Shell本身的PID(ProcessID)
$!
Shell最后运行的后台Process的PID
$?
最后运行的命令的结束代码(返回值)
正确为0,错误为非0
$-
使用Set命令设定的Flag一览
```bash
$*
所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@
列出bash执行时输入的的变量,所有的全部输出来
$#
列出bash执行时后面输入的变量个数
$0
Shell本身的文件名
$1~$n
执行时后面输入的参数值。$1是第1参数、$2是第2参数…。
[root@client ~]# read name
[root@client ~]# echo "${name:-"name"}"
name
如果在接收变量name时,没有输入直按回车,值就会输出name
test -e /etc/passwd && echo "exist" || echo "no exist"
得到:exist
判断一个文件是不是存在
-e文件是否存在,不管是文件还是目录
-f 是否存在并且为文件
-d是否存在且为目录
-r是否为可读
-s是否存在且为空白文件
test on1 -nt on2
-nt判断两上文件哪个最新建立
整数间判断
-eq
等于
-ne
不等于
-gt
大于
-lt
小于
字符串数据判断
-z 是否为0为空
-n 是否为非0为空
==是否相等
!= 是否不相等
[root@client ~]# read a
[root@client ~]# test -z $a && echo "exist" && exit 0
判断是否有输入?若没有则显示讯息并结束脚本
判断条件:
-a test -r file -a -x file
-o test -r file -o -x file
-i 如 test ! -x file ,当 file 不具有 x 时,回传true
[root@centos2 ~]# a=' '
[root@centos2 ~]# echo ${a:+OK} #如果a为有值则返回OK
[root@centos2 ~]# sed -i "${b}a ${f}" t.txt #在变量b后加入变量f的内容
egrep -w "(中|河南)" t.txt #-w可以精确匹配任意一个
egrep -w "${aa}" t.txt #aa变量精确匹配
sed -i "/c/ s/$/000/" t.txt #在t.txt文本中包含c字母那行的行未加上000
find ./ -iname a.txt #不分大小写找
find ./ -atime -n #多少天以内访问过 (把成mtime是修为时间,ctime为更改属性时间)
find ./ -atime +n #多少天以前访问过 (把成mtime是修为时间)
find ./ -empty #找空文件
find ./ -user root #查root用户文件
find ./ -type f -name "*.txt" -exec mv {} {}.bak \; #批量改文件后缀
rename .c .h *.c #批量改后缀
find ./ -type f -name "*.txt" -exec tar -cvf 1111.tar.gz {} + ; #批量压缩
pgrep -l hci0 |wc -l #计算hci0进程数量
egrep "root | avahi" #可过滤两个关键字
sed "s/[0-9]//g" #删除所有的数字
sed -n '$p' #取最后一行,如果是双引号就要转义\$ sed里面的* $ ( { 都要转义\
sed "s/ //g" #去除空格
date -d "-1 day" +"%F %T" #一天以前的时间
seq -w 01 09 #取01-09数字
awk -F ':' '{print $NF}' #$NF取最后一列
cat 11.log |awk -F":" '$2>90 {print $1 "\t" $2}' #awk重要写法
sar -n DEV 2 2 |egrep "eno"|awk 'END {print "rx=" $5*8000 "kbps" "\n" "tx=" $6*8000 "kbps" }'
#上面取网卡的上传和下载速度
ip addr show dev eno16777736 |grep "inet" |awk '{print $2}'|sed -n '1p' #取网卡ip
mysql -uroot -h localhost -padmin -Bse "show databases" #直接查看数据库存
以下为创建用户和组
users(){
userss=(sales devs dply)
for i in `echo "${userss[@]}"`
do
groupadd ${i}
if [ "$?" -eq "0" ];then
for a in `(seq 1 2)`
do
useradd -M -s /sbin/nologin -g $i $i$a
done
else
echo "your input error..."
return 1
fi
done
}
Main(){
users
if [ "$?" -eq "1" ];then
exit 1
fi
}
Main
for循环:
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:~/bin
export PATH
read -p "pleae input network bit: " number
function hello(){
s=0
for ((i=1; i<=${number}; i=i+1))
do
s=$((${s}+${i}))
done
echo ${s}
}
main(){
hello
}
main
for简单用法:
function hello(){
for a in dog cat elephant
do
echo "there are ${a}s...."
done
}
main(){
hello
}
main
特殊输入日期:
dates=$(date --date= +%Y%m%d)
[root@client ~]# echo ${dates}.log
20220314.log
ping写法
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:~/bin
export PATH
read -p "pleae input network bit(192.168.1): " network
read -p "pleae input ip_addr_start: " start_ip
read -p "pleae input ip_end_start: " end_ip
function hello(){
for ip_addr in $(seq ${start_ip} ${end_ip})
do
ping -c 1 -w 1 ${network}.${ip_addr} &>/dev/null && result=0 || result=1
if [ "${result}" == "0" ];then
echo "${network}.${ip_addr} is up!"
else
echo "${network}.${ip_addr} is down!"
fi
done
}
main(){
hello
}
main
case用法
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:~/bin
export PATH
read -p "pleae input: " choice
function hello(){
case ${choice} in
"helo")
echo "hello, how are you"
;;
"")
echo "you die"
;;
*)
echo "die"
;;
esac
}
main(){
hello
}
main
case简单用法:
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:~/bin
export PATH
#$(1) 就是命令执行时的第一个变量参数
case ${1} in
"helo")
echo "hello, how are you"
;;
"")
echo "you die"
;;
*)
echo "die"
;;
esac
if用法
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:~/bin
export PATH
if [ ! -e logical ];then
touch logical
echo "make a file logical"
exit 1
elif [ -e logical ] && [ -f logical ];then
rm -rf logical
mkdir logical
echo "remove file logical"
echo "mkdir logical"
exit 1
elif [ -e logical ] && [ -d logical ];then
rm -rf logical
echo "remo logical"
exit 1
else
echo "does here have anthing"
fi
&& ||用法:
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:~/bin
export PATH
read -p "please 1: " one
[ "${one}" == "Y" -o "${one}" == "y" ] && echo "ok" && exit 0
[ "${one}" == "N" -o "${one}" == "n" ] && echo "ok" && exit 0
echo "your input ${one} is error!" && exit 0
while用法
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:~/bin
export PATH
read -p "please 1: " one
i=0
s=0
while [ "${i}" != "${one}" ]
do
i=$(($i+1))
s=$(($s+$i))
done
echo -e "1+2...$one is==: $s"
netstat用法:
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:~/bin
export PATH
read -p "please input port: " port
inputs=`echo "${port:-"port"}"`
if [ "${inputs}" == "port" ];then
echo "your input empty."
exit 1
fi
netstat_file=$(date --date= +%Y%m%d)
netstat -tunl >${netstat_file}.txt
ports=$(grep "${port}" ${netstat_file})
if [ "${ports}" != "" ];then
echo "web port is up"
elif [ "${ports}" != "" ];then
echo "ssh port is up"
else
echo "web and ssh port is down"
fi
简单语法:
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:~/bin
export PATH
read -p "please 1: " one
read -p "please 2: " two
result=$((${one}+${two}))
echo ${result}
exit 0
监控各硬件信息:
#!/bin/bash``
```bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
versions=`cat /etc/redhat-release |awk '{print "version is:" $1"-"$4}' |awk -F '.' '{print $1"."$2}'`
disks=`fdisk -l |grep "Disk" |grep -n "sectors$" |sed -e "s/:/-/g" -e "s/,//g" |awk '{print "disk is:" $2 $3 $4}'`
mens=`free -h |sed -n "2p" |awk '{print "men free is:""\n" "total-"$2 "\n" "used-"$3"\n" "free-" $4}'`
cpus=`cat /proc/cpuinfo |grep "physical id" |sort |uniq -c|awk '{print "CPU:" "\n" $2,$NF,"\n" "Core:"$1}'`
machines=`dmidecode |grep "Product Name" |sed -ne "1p" |sed -e "s/[\t]//g"`
自动输入模式
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
check_error(){
if [ $? -eq 1 ];then
echo "$1 error" >/root/t.log
return 1
fi
}
iotops(){
#这种情况不能在远程终端下用只能在真机的终端下用
iotop >1.txt <<EOF
q
EOF
check_error inputs error
cat 1.txt
}
main(){
iotops
if [ $? -eq 1 ];then
exit 1
fi
}
main;
简单判断写法:
test(){
if [ "$#" -ne 2 ];then
echo '你输入的变量数量不对。。'
return 1
else
accept="$@"
accepts=`echo $accept|awk '{print $2}'`
expr 1 + $accepts &>/dev/null
if [ "$?" -ne 0 ];then
echo "你输入的第二个值不是数字."
return 1
else
echo "$@"
fi
fi
}
main(){
test $1 $2
if [ $? -eq 1 ];then
exit 1
fi
}
各种信息采集:
cpu性能采集
sar -P ALL 2 10
每2秒采集一次一共采10次
-----------------------------
网卡性能采集
sar -n DEV 2 5
--------------------------------
磁盘采集
iostat -xdk 2 10
--------------------------------
内存采集
sar -r 2 10
传值经典写法:
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
test(){
if [ "$#" -ne 2 ];then
echo '你输入的变量数量不对。。'
return 1
else
accept="$@"
accepts=`echo $accept|awk '{print $2}'`
expr 1 + $accepts &>/dev/null
if [ "$?" -ne 0 ];then
echo "你输入的第二个值不是数字."
return 1
else
echo "$@"
fi
fi
}
main(){
test $1 $2
if [ $? -eq 1 ];then
exit 1
fi
}
main $1 $2
统计内存使用:
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:~/bin
export PATH
test(){
number=`ps -aux |awk 'NR!=1{print $4}' |wc -l`
s=0
for i in $(seq 1 ${number})
do
b=`ps -aux |awk 'NR != 1 {print $4}' |awk -v values=$i 'NR==values {print $0}'`
s=`echo $s+$b |bc`
done
echo ${s}
return 1
}
main(){
test
if [ $? -eq 1 ];then
exit 1
fi
}
main
统计内存使用第二种简单的写法:
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:~/bin
export PATH
test(){
number=`ps -aux |awk 'NR!=1{print $4}' |wc -l`
s=0
for i in `ps -aux |awk 'NR !=1 {print $4}'`
do
s=`echo $s+$i |bc`
done
echo ${s}
return 1
}
main(){
test
if [ $? -eq 1 ];then
exit 1
fi
}
main
do…done循环判断带次数框架
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
three(){
read -p "please user: " user
read -p "please passwd: " password
read -p "please ders: " der
users=`echo ${user:-user}`
passwords=`echo ${password:-password}`
ders=`echo ${der:-der}`
}
inputs(){
i=1
number=3
three
until [ "${users}" != "user" ] && [ "${passwords}" != "password" ] && [ "${ders}" != "der" ]
do
echo "你还有${number}次错误的机会!"
three
number=$((${number}-${i}))
if [ "${number}" -eq 0 ];then
echo "你连续错了3次. by!"
return 1
fi
done
echo "your input corrent !"
return 1
}
Main(){
inputs
if [ "$?" -eq "1" ];then
exit 1
fi
}
Main

本文介绍了一系列日志统计和文件处理的高级技巧,包括使用awk、sed、grep等工具进行日志分析,文件搜索与操作,以及系统管理命令的高效应用。涵盖了日志分析的常见手法、文件内容的修改、数据的筛选与统计,适用于系统管理员和高级用户提升工作效率。
976

被折叠的 条评论
为什么被折叠?



