Linux总结

一、文件内容按行去重

$ cat file1
hello
ni
hao
hello
ni
ni
world

  去重,使用shell的数组概念,shell的数组index可以为字符串,实现一种字典的概念。

$ awk '!a[$0]++ {print $0}' file1
hello
ni
hao
world

二、screen用法

  • screen -S session 创建一个会话(窗口)
  • screen -D session 使一个窗口远程
  • screen -r session 恢复一个远程了的窗口
  • screen -ls 查看所有窗口
  • ctrl + a + d 在当前窗口执行该命令,则退出到上一个窗口
  • screen -X -S session quit 结束该窗口
  • exit 在当前窗口执行该命令,则结束该窗口

三、sed | tr 替换命令

# sed命令将小写转为大写
echo "abcE" |sed 's/[a-z]/\U&/g'
# ABCE 

# 首字母替换
echo "abcE" |sed 's/\b[a-z]/\U&/g'
# AbcE

# sed 正则替换
echo aa123bb | sed -r 's#([a-z]+)([0-9]+)([a-z]+)#\2#g'
# 123

# tr命令将小写转为大写
echo abcE | tr 'a-z' 'A-Z'
# ABCE

# 将字符串中的空格替换为制表符(包括换行符)
echo "hello world" | tr [:space:]  '\t'
# hello	world	

四、2>&1用法

\qquad command >out.file 2>&1 & 解析

a) command >out.file是将command的输出重定向到out.file文件,即输出内容不打印到屏幕上,而是输出到out.file文件中,其等同于command 1>out.file

b) 2>&1 是将标准出错重定向到标准输出,这里的标准输出已经重定向到了out.file文件,即将标准出错也输出到out.file文件中。

c) 最后一个& , 是让该命令在后台执行。

e.g.

commanddescribe
ls 2>1不会报没有2文件的错误,但会输出一个空的文件1
ls 2 2>1没有2这个文件的错误输出到了1中
ls 2 2>&1不会生成1这个文件了,不过错误跑到标准输出了
ls 3 >2 2>&1实际上可换成 ls 3 1>2 2>&1;错误等同标准输出到2文件中

\qquad 为何2>&1要写在后面?

a) command > file 2>&1 ,首先是command > file将标准输出重定向到file中, 2>&1 是标准错误拷贝了标准输出的行为,也就是同样被重定向到file中,最终结果就是标准输出和错误都被重定向到file中。

b) command 2>&1 >file ,2>&1 标准错误拷贝了标准输出的行为,但此时标准输出还是在终端。>file 后输出才被重定向到file,但标准错误仍然保持在终端。

\qquad command > file 2>file 对比 command > file 2>&1

a) command >file 2>file 的意思是将命令所产生的标准输出信息,和错误的输出信息送到file 中.command >file 2>file 这样的写法,stdout和stderr都直接送到file中, file会被打开两次,这样stdout和stderr会互相覆盖,这样写相当使用了FD1和FD2两个同时去抢占file的管道。

b) ommand >file 2>&1 这条命令就将stdout直接送向file, stderr继承了FD1管道后,再被送往file,此时,file 只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stderr的内容.

\qquad 从IO效率上,前一条命令的效率要比后面一条的命令效率要低,所以在编写shell脚本的时候,较多的时候我们会用command > file 2>&1 这样的写法

五、linux数组用法

\qquad 实例参照

#!/bin/bash

# shell 数组赋值,并按索引取值
array=(a b c d)
echo "First Element Is ${array[0]}"
# First Element Is a

# 遍历数组元素
echo "All Element Are ${array[*]}"
# All Element Are a b c d

for i in ${array[*]}
do
        echo "Element Show $i"
done

# Element Show a
# Element Show b
# Element Show c
# Element Show d

# 获取数组长度
echo "The Length Is ${#array[*]}"
# The Length Is 4

六、打印两行号之间的内容

$ cat file1
a
b
c
d
e
f
g

\qquad NR是awk中表示行号的

$ awk 'NR > 2 && NR < 5 {print}' file1 
c
d
### 或者如下
$ awk '{if(NR > 2 && NR <5){print}}' file1 
c
d
# 此时的if可以省去

七、保留最新的N个文件

  • method one
# awk FS 指定列分隔符
# NR 行数计数
# NF 每列分隔数
# $NF 表示最后一列
ll -lt |grep  'keyword' | awk 'begin{FS=" "}NR>2{print $NF}'|xargs echo
  • method two
num=0
ReservedNum=3
while (( num < $ReservedNum ))
do
	f=`ls -rt | grep 'keyword' | head -1`
	echo $f
	rm -f $f
	let num++
done

八、awk典型示例

\qquad 测试文件stu.txt,内容如下:

Allen    80    90    96    98
Mike    93    98    92    91
Zhang    78    76    87    92
Jerry    86    89    68    92
Han    85    95    75    90
Li    78    88    98    100

\qquad 现有需求,生成新文件detail.txt,并计算平均值,文件头"Name",“Chinese”,“English”,“Math”,“Physical”,“Average”,且将”Chinese“成绩80多分的输出文件count.txt.

Allen    80    90    96    98
Mike    93    98    92    91
Zhang    78    76    87    92
Jerry    86    89    68    92
Han    85    95    75    90
Li    78    88    98    100

\qquad 首先实现增加文件头.

awk 'BEGIN{
	printf "%-20s%-20s%-20s%-20s%-20s%-20s\n","Name","Chinese","English","Math","Physical","Average"
}' stu.txt

\qquad 其次,实现计算平均值

awk 'BEGIN{
	printf "%-20s%-20s%-20s%-20s%-20s%-20s\n","Name","Chinese","English","Math","Physical","Average"
}{
	sum=$2+$3+$4+$5;avg=sum/4
}{
	printf 	"%-20s%-20d%-20d%-20d%-20d%-0.2f\n",$1,$2,$3,$4,$5,avg
}' stu.txt

\qquad 其次,实现统计Chinese成绩80+的个数。

awk 'BEGIN{
	printf "%-20s%-20s%-20s%-20s%-20s%-20s\n","Name","Chinese","English","Math","Physical","Average";
	N=0
}{
	sum=$2+$3+$4+$5;
	avg=sum/4
}{
	printf "%-20s%-20d%-20d%-20d%-20d%-0.2f\n",$1,$2,$3,$4,$5,avg
} match($2,/(^8.+)/,a){
N++
}END{
	print "chinese total:"N
}' stu.txt

\qquad 最后分别写入文件

awk -v f1='detail.txt' -v f2='count.txt' 
'BEGIN{
	printf "%-20s%-20s%-20s%-20s%-20s%-20s\n","Name","Chinese","English","Math","Physical","Average" > f1 ;
	N=0
}{
	sum=$2+$3+$4+$5;
	avg=sum/4
}{
	printf "%-20s%-20d%-20d%-20d%-20d%-0.2f\n",$1,$2,$3,$4,$5,avg >> f1
} match($2,/(^8.+)/,a){
N++
}END{
	print "chinese total:"N > f2
}' stu.txt
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值