linux shell命令求解。累加行数的命令。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux shell命令求解。累加行数的命令。相关的知识,希望对你有一定的参考价值。

有如下一个linux中的文本文件a.txt,内容如下
1|a1
2|a2
3|a3
4|a4
1|b1
2|b2
1|c1
2|c2
3|c3
4|c4
5|c5
1|d1
2|d2
3|d3
1|e1
2|e2
1|f1
2|f2
3|f3

我想输入某个查询内容,程序能够自动计算出某类内容的行数,并得到类似如下的结果:

如果输入查询内容"d1",输出“3”行;
或输入查询内容"b1",输出“2”行;
或输入查询内容"e1",输出“2”行;
或输入查询内容"c1",输出“5”行;

也就是说,输入查询内容后,linux命令进行扫描文本,遇到下一个“1|”后,结束扫描行数,并累加行数。

你这个不难实现,问题你是你表达不清楚,一会说"d1“关键字,一会又说"1|"
前面你说。如果输入查询内容"d1",输出“3”行,什么依据?因为3行有"d"?
我猜你是这个意思吧?
cat a.txt | grep "|." -o | tr -d "|" | uniq -c
参考技术A [root@localhost shell]# cat a.txt | grep d | wc -l
3
[root@localhost shell]# cat a.txt | grep b | wc -l
2
[root@localhost shell]# cat a.txt | grep e | wc -l
2
[root@localhost shell]# cat a.txt | grep c | wc -l
5追问

如果是被查询的字符串是不规则的,那应该如何写?我想利用“1|”来判断,因为“1|”是关键字。

Shell命令和流程控制[linux常用命令的使用]

在shell脚本中使用三类命令:

  1. unix命令
  2. 概念:管道、重定向、backtick
  3. 流程控制

1 unix命令

echo "some text":在屏幕上输出信息

ls:文件列表

wc -l file wc -w file wc -c file:计算文件的行数(line)、单词数(word)、字符数(character)。

cp sourcefile destfile:文件拷贝

mv oldname newname:重命名文件或移动文件

rm file:删除文件

grep ‘pattern‘ file:在文件内搜索字符串和正则表达式的字符串。

cut -b column file:将指定范围内的文件内容输出到标准输出设备(屏幕)上。

比如:输出每行第5至9个字符 cut -b5-9 file.txt.

cat file.txt:输出文件内容到标准输出设备(屏幕)上。

file somefile:取得文件somefile的文件类型

read var:提示用户输入,并将输入内容赋值给变量var.

sort file.txt:对file.txt文件所有行进行排序。

uniq:只输出文件中内容不一致的行,如:sort file.txt | uniq

expr:进行数学运算,比如进行2+3的运算:expr 2 "+" 3

find:搜索文件,如根据文件名搜索:find . -name filename -print.

tee: 将数据输出到标准输出设备(屏幕) 和文件,比如:somecommand | tee outfile
basename file: 返回不包含路径的文件名,如: basename/bin/tux 会返回 tux
dirname file: 返回文件所在路径,如:dirname /bin/tux 会返回/bin
head file: 打印文本文件开头几行
tail file : 打印文本文件末尾几行
sed: Sed 是一个基本的查找替换程序。可以从标准输入(如命令管道)读入文本,并将结果输出到标准输出(屏幕);该命令采用正则表达式进行搜索。不要和 shell 中的通配符相混淆。比如将 ubuntu 替换为Ubuntu :cat text.file | sed ‘s/ubuntu/Ubuntu/‘ > newtext.file
awk: awk 用来提取文本文件中的字段。缺省的字段分割符是空格,可以使用 -F 指定其它分割符。cat file.txt | awk -F, ‘{print $1"," $3 }‘,这里我们使用 , 作为字段分割符,同时打印第一和第三个字段。如果该文件内容为 Adam Bor, 34, IndiaKerry Miller, 22, USA,则上述命令的输出为:Adam Bor, IndiaKerry Miller, USA.

2 概念:管道、重定向、backtick 

管道(|):将一个命令的输出作为另外一个命令的输入。比如:grep "hello" file.txt | wc -l

重定向:将命令的结果输出到文件,而不是标准输出(屏幕)。

  > 写入文件并覆盖旧文件

  >> 加到文件的尾部,保留旧文件内容。

反短斜线:使用反短斜线可以将一个命令的输出作为另外一个命令的一个命令行参数。

find . -mtime -l -type f -print:查找过去24小时(-mtime -2表示过去48小时)内修改过的文件。

tar -zcvf lastmod.tar.gz ‘find . -mtime -l -type f -print‘

3.流程控制

3.1 if表达式

  if 表达式如果条件为真则只需then后的部分

if...;then...
    ...
elif ...;then
    ...
else
    ...
fi
//可以使用测试命令来对条件进行测试。比如比较字符串、判断文件是否存在及是否可读等等
//" [] " 来表示条件测试,注意这里的空格,要确保方括号前后的空格。
eg:
[ -f "somefile" ] :判断是否是一个文件
[ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限
[ -n "$var" ]:判断$var变量是否相等
[ "$a" = "$b" ]:判断$a和$b是否相等

eg:
#!/bin/sh
if [ "$SHELL" = "/bin/bash" ]; then
 echo "your login shell is the bash (bourne again shell)"
else
 echo "your login shell is not bash but $SHELL"
fi

3.2 case表达式

case表达式可以用来匹配一个给定的字符串,不是数字。

eg://case表达式用来匹配一个给定的字符串,而不是数字。
case ... in 
...)     do something here ;;
esac

eg:
#!/bin/sh
ftype=`file "$1"`//``是Esc下面的顿号,表示还需要file指令判断$1的文件类型
case "$ftype" in 
"$1: Zip archive"*)          unzip "$1" ;;
"$1: gzip compressed"*)  gunzip "$1" ;;
"$1: bzip2 compressed"*)  bunzip2 "$1" ;;
*)     error "File $1 can not be uncompressed with smartzip";;
esac     

3.3 select表达式

select 表达式:一种bash的扩展应用,用于交互式使用,用户可以从一组不同的值中进行选择。

//select表达式用于交互使用,用户可以从一组不同的值中进行选择。
select var in ... ; do
    break
done

eg:test003.sh
#/bin/sh
echo "what is your favourite OS?"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other" ; do
    break
done
echo "You have selected $var"
//执行结果
sh test003.sh
what is your favourite OS?
1) Linux
2) Gnu Hurd
3) Free BSD
4) Other
#? 1
You have selected Linux 

3.4 loop表达式[while-loop、for-loop]

//while-loop将运行直到表达式为真。
while ...; do
....
done

//for-loop表达式查看一个字符串(字符串用空格分隔),然后将其赋给一个变量
for var in ....;do
    ....
done

eg1:test.sh
#!/bin/sh
s=0
i=0
while [ "$i" != "100" ] ;do
        i=$(($i+1))  //数值运算:((运算内容))
        s=$(($s+$i))
done
echo "result is == $s"

eg2:
for var in A B C;do
    echo "var is $var"
done
//执行结果
var is A
var is B
var is C 

3.5 $*

$*:代表["$1c$2c$3c$4"],其中c为分隔字符,默认为空格键,所以本例中代表[ "$1" "$2" "$3" "$4" ]之意。

$#:表示包含参数的个数

$1...$9:表示第一个参数...第九个参数,表示用户从命令行输入的参数。

eg://$*表示特殊的变量,包含了所有输入的命令行数值。
//打印一些RPM包的统计信息
test.sh
for rpmpackage in $*; do
 if [ -r "$rpmpackage" ];then
  echo "=============== $rpmpackage =============="
  rpm -qi -p $rpmpackage
 else
  echo "ERROR: cannot read file $rpmpackage"
 fi
done
//运行:test.sh openssh.rpm w3m.rpm webgrep.rpm
$*变量包含3个运行的3个值:openssh.rpm w3m.rpm webgrep.rpm

4 快捷操作符

快捷操作符:&&、|| .

//&&、|| 都是快捷操作符,左边为真则执行右边的语句。eg:A && B
eg1://判断/etc/shadow是否为文件,如果文件存在,就打印内容
[ -f "/etc/shadow" ] && echo "This computer uses shadow passwords"
eg2:
test.sh://判断$mailfolder是否可读,可读打印文件中From一行[不可读或操作不生效,打印错误信息后脚本退出]
#!/bin/sh
mailfolder=/var/spool/mail/james
[ -r "$mailfolder" ] || { echo "Can not read $mailfolder" ; exit 1; }
echo "$mailfolder has mail from:"
grep "^From " $mailfolder

 5 编写脚本的一般步骤

一般脚本都有帮助和输入参数,并且写一个伪脚本。脚本里面包含了大多数脚本都需要的框架结构,然后再插入自己的函数。

 

以上是关于linux shell命令求解。累加行数的命令。的主要内容,如果未能解决你的问题,请参考以下文章

Windows 下统计行数的命令

linux shell命令向文件内特定的行插入数据,如注释等

Linux常用命令

Linux addr2line命令

Linux——比较实用的shell命令

如何在Linux命令行下查询字典