繁体   English   中英

在 awk 命令行中使用 unix 命令来处理字段

[英]Use unix command inside awk commandline to process fields

有没有办法在 awk 单线中使用 unix 命令来做某事,并在 STDIN 上使用 output 的结果?

例如:

ls -lrt|awk '$8 !~ /:/ {system(date -d \"$6" "$7" "$8\" +"%Y%m%d")"|\t"$0}'

您正在解析ls ,这可能会导致几个问题。 当您尝试通过在其前面的 yyyymmdd 的最后修改来获取文件名顺序时,您可以查看

# not correct for some filenames
stat --format "%.10y %n" * | tr -d '-' | sort

对于带有-的文件名,该解决方案失败。 解决这个问题的一种方法是使用

# Still not ok
stat --format "%.10y %n" * | sed -r 's/^(..)-(..)/\1\2/' | sort

对于带有换行符的文件名,这将失败。

touch -d "2019-09-01 12:00:00" "two
lines.txt"

显示了您也可以使用ls看到的一些问题。
你应该如何解决这个问题取决于你的确切要求。
例子

find . -maxdepth 1  ! -name "[.]*" -printf '%TY%Tm%Td ' -print0 |
   sed 's#[.]/##g'|  tr "\n\0" "/\n" | sort

解释:
maxdepth 1只查看当前目录
. -name "[.]*" . -name "[.]*"忽略隐藏文件
-printf '%TY%Tm%Td ' YYYYMMDD 和空格
-print0不要在每个结果的末尾使用\n但 NULL
sed 's#[.]/##g'去掉路径./
tr "\n\0" "/\n"用 / 替换文件名中的换行符,用换行符替换 NULL

在排序之后你可能想要tr '|' '\n' tr '|' '\n'

如果你想拥有命令的 output,你可以使用getline

kent$  awk 'BEGIN{"date"|getline;print}'
Fri 15 Nov 2019 10:51:10 AM CET

您还可以将 output 分配给 awk 变量:

kent$  awk 'BEGIN{"date"|getline v;print v}'        
Fri 15 Nov 2019 10:50:20 AM CET

您正在尝试从ls格式化日期 output 。

find命令对日期和时间 output 具有广泛的控制。 使用-printf操作。

例如这里:

$ ls -l
-rw-rw-r--. 1 cfrm cfrm 41 Nov 15 09:12 input.txt
-rw-rw-r--. 1 cfrm cfrm 67 Nov 15 09:13 script.awk

$ find . -printf "fileName=%f \t formatedDate-UTC=[%a] \t formatedDate-custom=[%AY-%Am-%Ad]\n"
fileName=.       formatedDate-UTC=[Fri Nov 15 09:43:32.0222415982 2019]          formatedDate-custom=[2019-11-15]
fileName=input.txt       formatedDate-UTC=[Fri Nov 15 09:12:33.0117279463 2019]          formatedDate-custom=[2019-11-15]
fileName=script.awk      formatedDate-UTC=[Fri Nov 15 09:13:38.0743189896 2019]          formatedDate-custom=[2019-11-15]

对于按时间戳排序,我们可以在时间戳标记上标记排序开始(以下示例中的[

$ find . -printf "%f timestamp=[%AY%Am%Ad:%AT]\n" |sort -t [
22114 timestamp=[20190511:10:32:22.6453184660]
5530 timestamp=[20190506:01:03:01.2225343480]
5764 timestamp=[20190506:01:03:34.7107944450]
.font-unix timestamp=[20191115:13:27:01.8699219890]
hsperfdata_artemis timestamp=[20191115:13:27:01.8699219890]
hsperfdata_cfrm timestamp=[20191115:13:27:01.8709219730]
hsperfdata_elasticsearch timestamp=[20191115:13:27:01.8699219890]
.ICE-unix timestamp=[20191115:13:27:01.8699219890]
input.txt timestamp=[20191115:09:12:33.1172794630]
junk timestamp=[20191115:09:43:32.2224159820]
script.awk timestamp=[20191115:09:13:38.7431898960]
systemd-private-1a6c51334d6f4723b46fe5ca51b632c6-chronyd.service-AoZvZM timestamp=[20190516:05:09:51.1884573210]
systemd-private-1a6c51334d6f4723b46fe5ca51b632c6-vgauthd.service-f2m9rt timestamp=[20190516:05:09:51.1884573210]
systemd-private-1a6c51334d6f4723b46fe5ca51b632c6-vmtoolsd.service-0CJ32C timestamp=[20190516:05:09:51.1884573210]
.Test-unix timestamp=[20191115:13:27:01.8699219890]
. timestamp=[20191115:13:26:56.8770048750]
.X11-unix timestamp=[20191115:13:27:01.8699219890]
.XIM-unix timestamp=[20191115:13:27:01.8699219890]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM