Ami*_*t G 108 unix linux shell multiple-columns
我正在尝试从DbgView日志文件中删除前两列(我不感兴趣).我似乎无法找到从第3列开始直到行结束的示例.请注意,每一行都有可变数量的列.
Jon*_*erg 102
awk '{for(i=3;i<=NF;++i)print $i}'
Run Code Online (Sandbox Code Playgroud)
Mar*_*cin 102
...或更简单的解决方案:cut -f 3- INPUTFILE
只需添加正确的分隔符(-d)即可获得相同的效果.
小智 96
awk '{ print substr($0, index($0,$3)) }'
Run Code Online (Sandbox Code Playgroud)
解决方案在这里找到:http:
//www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-count-179078/
Pau*_*ce. 32
Jonathan Feinberg的回答将每个字段打印在一个单独的行上.您可以使用printf
在同一行重建输出记录,但您也可以将字段向左移动.
awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
Run Code Online (Sandbox Code Playgroud)
gho*_*g74 16
awk '{$1=$2=$3=""}1' file
Run Code Online (Sandbox Code Playgroud)
注意:这个方法会在1,2,3个字段中留下"空白",但如果您只想查看输出则不会出现问题.
awk -v m="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
Run Code Online (Sandbox Code Playgroud)
这会在给定的字段n,N之前切断,并打印该行的所有其余部分,包括字段nr.N并保持原始间距(它不重新格式化).如果字段的字符串也出现在该行的其他位置,则不会产生影响,这是daisaa答案的问题.
定义一个功能:
fromField () {
awk -v m="\x0a" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
$ echo " bat bi iru lau bost " | fromField 3
iru lau bost
$ echo " bat bi iru lau bost " | fromField 2
bi iru lau bost
Run Code Online (Sandbox Code Playgroud)
输出维护所有内容,包括尾随空格
适用于'/ n'是记录分隔符的文件,因此行内没有新行字符.如果要将其与其他记录分隔符一起使用,请使用:
awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
Run Code Online (Sandbox Code Playgroud)
例如.适用于几乎所有文件,只要它们不使用十六进制字符.1行内.
如果要在第3行之后打印列,例如在同一行中,可以使用:
awk '{for(i=3; i<=NF; ++i) printf "%s ", $i; print ""}'
Run Code Online (Sandbox Code Playgroud)
例如:
Mar 09:39 20180301_123131.jpg
Mar 13:28 20180301_124304.jpg
Mar 13:35 20180301_124358.jpg
Feb 09:45 Cisco_WebEx_Add-On.dmg
Feb 12:49 Docker.dmg
Feb 09:04 Grammarly.dmg
Feb 09:20 Payslip 10459 %2828-02-2018%29.pdf
Run Code Online (Sandbox Code Playgroud)
它将打印:
20180301_123131.jpg
20180301_124304.jpg
20180301_124358.jpg
Cisco_WebEx_Add-On.dmg
Docker.dmg
Grammarly.dmg
Payslip 10459 %2828-02-2018%29.pdf
Run Code Online (Sandbox Code Playgroud)
正如我们所看到的,即使有空间,工资单显示在正确的行中.
小智 7
awk '{a=match($0, $3); print substr($0,a)}'
Run Code Online (Sandbox Code Playgroud)
首先找到第三列的开始位置。使用 substr,您将打印从位置(在本例中为 a)到行尾的整行($0)。
以下行如何:
awk '{$1=$2=$3=""; print}' file
基于@ ghostdog74建议.当你过滤线时,我的表现会更好,即:
awk '/^exim4-config/ {$1=""; print }' file
以下 awk 命令打印每行的最后 N 个字段,并在行末尾打印一个新行字符:
awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
Run Code Online (Sandbox Code Playgroud)
下面的示例列出了 /usr/bin 目录的内容,然后保存最后 3 行,然后使用 awk 打印每行的最后 4 列:
$ ls -ltr /usr/bin/ | tail -3
-rwxr-xr-x 1 root root 14736 Jan 14 2014 bcomps
-rwxr-xr-x 1 root root 10480 Jan 14 2014 acyclic
-rwxr-xr-x 1 root root 35868448 May 22 2014 skype
$ ls -ltr /usr/bin/ | tail -3 | awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
Jan 14 2014 bcomps
Jan 14 2014 acyclic
May 22 2014 skype
Run Code Online (Sandbox Code Playgroud)