bash,awk,sed

需要一个功能,查找字典表,然后将想要查找的字段所在的行,全部打印出来。

方法1:sed -n "/^${1} /p" ../../zh_broadcastnews_utf8.dic

方法2:awk '/^'"$1"' / {print}' ../../zh_broadcastnews_utf8.dic;


echo -e "a=\`ifconfig eth1 |grep \"TX bytes\"|awk '{print \$6}'|cut -f2 -d \":\"\`" > /opt/1  看清楚awk 中对$6转义


http://blog.youkuaiyun.com/lonfee88/article/details/6034396  sed awk的用法差异

http://www.cnblogs.com/orez88/articles/1889781.html

处理命令回顾:

统计文本                wc

文本排序                sort

文本/目录对比            diff

在文件中查找关键行        grep / sed

在行文本中添、删、改    sed

在列文本中显示指定列    awk

在列文本中进行计算        awk

在列文本进行条件选择    awk


awk [-F filed-separator] “commands” input-file(s) 

/pattern1/{action1} 

awk将一行文字按分隔符(filed-separator)分为多个域,依次记为$ 1,$ 2 . . . $ n。$0代表所有域值。因此awk更适合于以域为单位来处理文件。加之ARGIND等内置变量,使awk能处理多个文件。典型的应用为查找一个文件中的某个字段是否在另一个文件中出现。

但由于$0代表所有域,即整行,因此awk也有简单行处理能力。

  1. sed [options] 'command' file(s)  
  2. sed [options] -f scrīptfile file(s) 
  1. 如果文件是格式化的,即由分隔符分为多个域的,优先使用awk
  2. awk适合按列(域)操作,sed适合按行操作
  3. awk适合对文件的抽取整理,sed适合对文件的编辑。



1.   awk用法   擅长取出文件中每一行的字段,判断该字段    FS 字段分隔符 RS 记录分隔符

awk    ‘NR==m,NR==n {print $k}’  path/filename  如果要用变量来表示m,n的值,则变量需要用单引号将其引起来。

awk    ‘NR==m {print $k}’  path/filename  如果m为bash变量,则使用awk    ‘NR=='$m' {print $k}’  path/filename 形式。

 awk使用shell变量   情形:

awk '{print v1, v2}' v1=$VAR1 v2=$VAR2 input_file

awk '{print v1, v2}' v1=$VAR1 file1 v2=$VAR2 file2

nawk -v v1=$VAR1 -v v2=$VAR2 '{print v1, v2}' input_file

awk '{print "'"$VAR1"'", "'"$VAR2"'"}' input_file

若awk正则表达式中引用shell变量,使用举例: awk '/^'"$1"' / {print}' ../../zh_broadcastnews_utf8.dic;


   {if ($1=="green") print "GO";
    else if ($1=="yellow") print "SLOW DOWN";
    else if ($1=="red") print "STOP";
    else print "SAY WHAT?";}

 $1 ~ /^France$/  -- searches for lines whose first field ("$1" -- more on "field variables"later) is the word "France", while:

 $1 !~ /^Norway$/    -- searches for lines whose first field is not the word "Norway".

/^Ireland/,/^Summary/  -- matches a block of text whose first line begins with "Ireland" and whose last line begins with "Summary".  

 NR == 10

 NR == 10,NR == 20  between

 NF == 0   -- matches all blank lines, or those whose number of fields is zero.

$1 == "France" -- is a string comparison that matches any line whose first field is the string "France".

  $1 == 100   -- matches any line whose first field has a numeric value equal to 100.

 (( $1 + 0 ) != $1 )

awk 'BEGIN {tv="0xA8"; print tv,tv+0}'

SEARCH PATTERNS (1)    http://bbs.chinaunix.net/thread-2077412-1-1.html
* The simplest kind of search pattern that can be specified is a simple
string, enclosed in forward-slashes ("/").  For example:
   /The/ -- searches for any line that contains the string "The".

/\$/  -- matches any line with a "$" in it.

/^[+-]?[0-9]+$/      ?匹配0个或一个[]内字符。+匹配一个或多个[]内字符。

   /^                  Find string at beginning of line.
   /^[-+]?             Specify possible "-" or "+" sign for number.
   /^[-+]?[0-9]+       Specify one or more digits "0" through "9".
   /^[-+]?[0-9]+$/     Specify that the line ends with the number.


特殊分隔符作用:

address.txt

Jimmy the Weasel
100 Pleasant Drive
San Francisco, CA 12345

Big Tony
200 Incognito Ave.
Suburbia, WA 67890

address.awk

BEGIN {
FS="\n"
RS=""
}

{
print $1 ", " $2 ", " $3

}

直行:"awk -f address.awk address.txt"。此代码将产生以下输出:

Jimmy the Weasel, 100 Pleasant Drive, San Francisco, CA 12345
Big Tony, 200 Incognito Ave., Suburbia, WA 67890


awk 还有一个特殊变量 ORS,全称是“输出记录分隔符”。通过设置缺省为换行 ("\n") 的 OFS,我们可以控制在 print 语句结尾自动打印的字符。缺省 ORS 值会使 awk 在新行中输出每个新的 print 语句。如果想使输出的间隔翻倍,可以将 ORS 设置成 "\n\n"。或者,如果想要用单个空格分隔记录(而不换行),将 ORS 设置成 ""。

将多行转换成用 tab 分隔的格式

举例循环:

BEGIN {
FS="\n"
RS=""
ORS=""
}

{
x=1
while ( x<NF ) {
print $x "\t"
x++
}
print $NF "\n"
}

在主代码块中,创建了一个变量 x 来存储正在处理的当前字段的编号。起初,它被设置成 1。然后,我们使用 while 循环(一种 awk 循环结构,等同于 C 语言中的 while 循环),对于所有记录(最后一个记录除外)重复打印记录和 tab 字符。最后,打印最后一个记录和换行;此外,由于将 ORS 设置成 "",print 将不输出换行。程序输出如下,这正是我们所期望的:

我们想要的输出。不算漂亮,但用 tab 定界,以便于导入电子表格

Jimmy the Weasel 100 Pleasant Drive San Francisco, CA 12345
Big Tony 200 Incognito Ave. Suburbia, WA 67890
Cousin Vinnie Vinnie's Auto Shop 300 City Alley Sosueme, OR 76543


awk多个分割符(其中一个是空格)怎么设置?

awk  -F '[:]' '{print $2}' /tmp/t | awk '{print $1}'
awk -F"[: ]" '{print $3}' /tmp/t

awk -F":| " '{print $3}' /tmp/t

awk正则表达式:

http://www.cnblogs.com/chengmo/archive/2010/10/11/1847772.html

http://blog.youkuaiyun.com/bonny95/article/details/5742008

其他:Linux下批量把PDF文件转换为txt文本的小程序

http://blog.youkuaiyun.com/bonny95/article/details/5735824



2. sed 用法  读取出一行,

sed [-nefri] ‘command’ 输入文本  


常用选项:
        
-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
        -e∶直接在指令列模式上进行 sed 的动作编辑;
        -f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
        -r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
        -i∶直接修改读取的档案内容,而不是由萤幕输出。
       

常用命令:
        a   ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
        c   ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
        d   ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
         i   ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
         p  ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
         s  ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!


sed -n '/bsp/!p' file
匹配不包含bsp的行


3. shell字符串操作

Bash Shell字符串操作小结

bash脚本错误:基数值过大

str="abcd"

expr length $str   # 4

  字符串 : 表达式        定位字符串中匹配表达式的模式

  match 字符串 表达式        等于"字符串 :表达式"
  substr 字符串 偏移量 长度    替换字符串的子串,偏移的数值从 1 起计
  index 字符串 字符        在字符串中发现字符的地方建立下标,或者标0
  length 字符串            字符串的长度
  + 记号            将记号解析为字符串,即使它是一个类似"match"或
                运算符"/"那样的关键字

  ( 表达式 )            表达式的值

解决办法:

#!/bin/bash
x=078
let y=10#$x+1
echo "$y"

或查找替换法: 将00开头的内容全局替换为空。

#!/bin/bash
x=078
x=$(echo "$x" | sed "s/^00*//g")
let y=$x+1
echo "$y"



-eq  等于 if [ "$a" -eq "$b" ] -ne 不等于 if [ "$a" -ne "$b" ] -gt 大于 if [ "$a" -gt "$b" ] -ge 大于等于 if [ "$a" -ge "$b" ] -lt 小于 if [ "$a" -lt "$b" ] -le 小于等于 if [ "$a" -le "$b" ] < 小于(在双括号里使用) (("$a" < "$b")) <=  小于等于 (在双括号里使用) (("$a" <= "$b")) > 大于 (在双括号里使用) (("$a" > "$b")) >= 大于等于(在双括号里使用) (("$a" >= "$b"))

字符串比较

= 等于 if [ "$a" = "$b" ]

== 等于 if [ "$a" == "$b" ]它和=是同义词。==比较操作符在一个测试和一个单方括号号里意思不同。

 1 [[ $a == z* ]] # 如果变量$a以字符"z"开始(模式匹配)则为真.

 2 [[ $a == "z*" ]] # 如果变量$a与z*(字面上的匹配)相等则为真.

3 4 [ $a == z* ] # 文件扩展和单元分割有效.

5 [ "$a" == "z*" ] # 如果变量$a与z*(字面上的匹配)相等则为真.

67 # 多谢Stéphane Chazelas 

!= 不相等if [ "$a" != "$b" ] 操作符在[[ ... ]]结构里使用模式匹配.

<小于,依照ASCII字符排列顺序 if [[ "$a" < "$b" ]]     if [ "$a" \< "$b" ]  注意"<"字符在 [ ] 结构里需要转义 > 大于,依照ASCII字符排列顺序   if [[ "$a" > "$b" ]]   if [ "$a" \> "$b" ]  注意">"字符在 [ ] 结构里需要转义. -z  字符串为"null",即是指字符串长度为零。 -n 字符串不为"null",即长度不为零. 在测试方括号里进行 -n测试时一定要把字符串用引号起来。 用没有引号引起的 ! -z或者在方括号里只有未引号引起的字符串 来进行测试一般都能工作,然而,这其实是不安全的测试。应该总是用引号把测试字符串引起来.


Linux bash shell 逐行读取文件的三种方法

分类: shell 2697人阅读 评论(0) 收藏 举报

方法一,指定换行符读取:

#! /bin/bash  
  
IFS="  
"  
  
for LINE in `cat /etc/passwd`  
do   
        echo $LINE 
done

 

方法二,文件重定向给read处理:

#! /bin/bash  
  
cat /etc/passwd |  while  read LINE  
do
         echo  $LINE 

done

 

 

方法三,用read读取文件重定向:

#! /bin/bash  
  
while read LINE
do
        echo $LINE 
done < /etc/passwd

 



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值